سؤال

لدي طريقة بسيطة في الكود الخاص بي والتي تبدو كما يلي:

- (BOOL)isFirstTimeLogin 
{
    NSString *t_gName = 
    [NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:kGroupIdentifierKey]];
    if ([t_gName isEqualToString:@""] || t_gName == nil) {
        DLog(@"LoginViewController, m:::isFirstTimeLogin, First time login happening.");
        return YES;
    }

    DLog(@"LoginViewController, m:::isFirstTimeLogin, Not a first time login.");
    return NO;
}

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

(gdb) بو t_gName
(باطل)

ما الخطأ الذي أفعله هنا؟لماذا يفشل الشرط في المرة الأولى التي يتم فيها تثبيت التطبيق ويكون t_gName عبارة عن PSTextFieldSpecifier فارغ/فارغ.لقد ذهبت إلى حد محاولة إضافة DefaultValue في حزمة الإعدادات الخاصة بي لسلسلة فارغة.

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

المحلول

[NSString stringWithFormat:@"%@", nil];

وهذا يخلق شيئا مثل هذا:

@"(null)"

وبالتالي فهو ليس كذلك nil ولا يساوي @"".

بالمناسبة

  1. لا تحتاج stringWithFormat: على الاطلاق.
  2. لا تحقق string == nil ولكن ل !string
  3. ليس عليك التحقق من وجود سلسلة فارغة، حيث توجد مجموعة واحدة أو هي nil.
  4. استخدم اسمًا أفضل من t_gName, ، ليس هناك سبب للأسماء المختصرة.

مثله:

- (BOOL)isFirstTimeLogin 
{
    NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
                                    objectForKey:kGroupIdentifierKey];
    if (!groupIdentifier) {
        DLog(@"First time login.");
        return YES;
    }

    DLog(@"Not a first time login.");
    return NO;
}

نصائح أخرى

وجرب هذا:

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     {

        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedFirstTime"])
        {
            // app already launched
            NSLog(@"app already launched");

        }
        else
        {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedFirstTime"];
            [[NSUserDefaults standardUserDefaults] synchronize];

             NSLog(@"First Time");

            // This is the first launch ever
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top