يظهر UialertView ثلاث مرات لكل مكالمة بدلاً من مرة واحدة فقط

StackOverflow https://stackoverflow.com/questions/2273283

  •  20-09-2019
  •  | 
  •  

سؤال

أحصل على سلوك غريب من nsalert في جزأين مختلفين من برنامجي. السلوك هو:

  1. يظهر التنبيه ثم بطريقة عفوية يختفي.
  2. يعود التنبيه إلى الظهور ثم يبقى حتى يرفضه المستخدم ، أي السلوك الطبيعي.
  3. ينبيه يعود مرة أخرى.

يحدث هذا السلوك فقط في المرة الأولى التي تسمى الطريقة التي تعرض التنبيه. بعد تلك المرة الأولى ، يتصرف بشكل طبيعي.

فيما يلي رمز واحد من الأجزاء التي يحدث فيها السلوك:

UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];

أو إذا كنت تفضل ذلك ، مع سياق أكثر قليلاً:

- (IBAction)locateMe {
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation * )oldLocation {
if (newLocation.horizontalAccuracy >= 0) {

    CLLocation *airportLocation = [[[CLLocation alloc] initWithLatitude:51.500148 longitude:-0.204669] autorelease];
    CLLocationDistance delta = [airportLocation getDistanceFrom: newLocation];
    long miles = (delta * 0.000621371) + 0.5; //metres to rounded mile
    if (miles < 3) {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];
    } else {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are not in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];

    }
}
}

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"Error." message:error.code delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[locationAlert show];
[locMan release];
locMan = nil;
}

أيه أفكار؟ شكرًا.

تعديل---------

المكان الآخر يحدث هذا هو:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@"Unable to download feed from web site (Error code %i )", [parseError code]];
NSLog(@"error parsing XML: %@", errorString);

UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}

بالنسبة للسياق ، تكون الحالة الأولى في AppDelegate والثاني في وحدة التحكم في العرض لعرض علامة التبويب الأولى. تحدث المشكلة الثانية في كل مرة يتم فيها إعادة تحميل XML عندما لا يكون هناك اتصال بالإنترنت. أول واحد يحدث فقط في المرة الأولى التي تسمى الوظيفة.

تعديل-----

إذا قمت بنقل التنبيه ، فهو يعمل. للأسف هذا ليس المكان الذي أريده!

- (IBAction)locateMe {

 UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[locationAlert show];
/*
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];*/
}

تحديث:

لقد وضعت بعض إدخالات NSLOG واكتشفت ذلك على الرغم من إضافة [locMan stopUpdatingLocation] كانت وظيفة didupdatetoLocking تعمل عدة مرات.

أظن أن الاختفاء التلقائي يحدث لأن عرض التنبيه يتم استدعاؤه مرة أخرى ويقوم البرنامج بمسح الحالة الأولى لإفساح المجال للثاني تلقائيًا.

أي أفكار لماذا [locMan stopUpdatingLocation] لن يكون موضع تقدير ، لكن في الوقت نفسه ، قمت للتو بنقل إعلان موقع Locationalert خارج الوظيفة (لذلك فهو عالمي) ، قم بتعيينه في وظيفة تحديد موقع ME الأولية واستخدم ما يلي في المرة الأولى التي تسمى:

[locationAlert show];
locationAlert = nil;

بهذه الطريقة يعمل بشكل مثالي.

هل كانت مفيدة؟

المحلول

أعتقد أن nsalert يختفي من تلقاء نفسه هو مفتاح حل هذا.

من السهل شرح سبب عرض التنبيه بشكل غير متوقع ، أي أنه تم تسميته بشكل غير متوقع. ومع ذلك ، ليس من الشائع رفض تنبيه برمجيًا. كل ما يتسبب في اختفائه هو على الأرجح أن يؤدي إلى الشاشة مرة أخرى.

لتصحيح أقترح:

(1) النظر في الكود الخاص بك عن nsalert – dismissWithClickedButtonIndex:animated: الطريقة ومعرفة ما إذا كنت بطريقة ما فأنت ترفض بالفعل التنبيه برمجيًا.

(2) أعتقد (شخص ما تحقق من هذا) أنه تتم إضافة طريقة عرض تنبيه كرسالة فرعية لأي عرض أساسي موجود حاليًا على الشاشة. قد يكون العرض الأساسي يختفي لسبب ما ويأخذ عرض التنبيه معه. إذا اختفى الرأي ثم يظهر مرة أخرى بسرعة كافية ، فقد لا يكون ذلك واضحًا عندما يكون التنبيه في المقدمة. (تحرير: انظر تعليق إد مارتي أدناه.)

(3) نظرًا لأن هذا يحدث في قطعتين منفصلتين من التطبيق ، قارن كلاهما للعثور على عنصر أو بنية شائعة. قد يكون هذا العنصر الشائع هو السبب. مشكلة غريبة.

EDIT01: تم تحديثه للحصول على معلومات إضافية

لو locMan متغير مثيل ISAN ، يجب تعريفه على أنه خاصية ويجب الوصول إليه في كل مرةself.locMan من خلال الوصول إليها مباشرة ، تفقد إدارة الاحتفاظ التلقائي.

نصائح أخرى

أنت لا تقوم بإيقاف تشغيل مدير موقعك عند عرض التنبيه لأول مرة. مع صقل الموقع بواسطة الجهاز (أي ، يتم زيادة الدقة) ، سيتم استدعاء ردك (يحتمل) عدة مرات. يجب عليك استخدام [Locman StopupDatingLocation] بعد شاشة التنبيه.

لقد قمت بتعيين بعض إدخالات NSLog واكتشفت أنه على الرغم من إضافة [locman stopupdatinglocation] ، كانت وظيفة تحديد موقع DidupDatetOlcing تعمل عدة مرات.

أظن أن الاختفاء التلقائي يحدث لأن عرض التنبيه يتم استدعاؤه مرة أخرى ويقوم البرنامج بمسح الحالة الأولى لإفساح المجال للثاني تلقائيًا.

أي أفكار حول سبب عدم تقدير [locman stopupdatinglocation] ، لكن في الوقت نفسه ، قمت للتو بنقل إعلان المحدد من الوظيفة (لذلك هو عالمي) ، قم بتعيينه في وظيفة تحديد موقع ME الأولية واستخدامها ما يلي في المرة الأولى التي تسمى:

[locationAlert show];
locationAlert = nil;

بهذه الطريقة يعمل بشكل مثالي.

لقد واجهت نفس المشكلة الدقيقة مع ظهور مربع الحوار ALERT للحظات ، وعاود الظهور ، وأخيراً ظهرت مرة أخرى بعد رفضها. كنت أقوم بمقارنة سلسلة قبل أن أقرر إظهار عرض التنبيه:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}}

لتصحيح هذا السلوك ، قمت ببساطة بالتحقق من السلسلة التي تم إرجاعها بدلاً من مجرد إظهار التنبيه:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else if([string isEqualToString:@"Error"]) {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}

كما حصلت على نفس المشكلة أثناء العمل على مدير الموقع. لقد راجعت هنا NSLOG ، لكن يتم تنفيذها عدة مرات ، وأخيراً أقوم بإنشاء كائنات متعددة وأستخدم مشاركًا لنفس ViewController الذي يحتوي في كثير من الأحيان يكتشف الموقع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top