سؤال

انا املك UISwitch داخل مخصص UITableViewCell (الفرعية التي أسميها RootLabeledSwitchTableCell).

تحتوي الخلية على UILabel و UISwitch بجانب بعضهما.

انا املك @property مسمى keychainSwitch هذا يشير إلى التبديل داخل هذه الخلية المخصصة:

@interface RootLabeledSwitchTableCell : UITableViewCell {
    IBOutlet UILabel *textLabel;
    IBOutlet UISwitch *labeledSwitch;
}

@property (nonatomic, retain) IBOutlet UILabel *textLabel;
@property (nonatomic, retain) IBOutlet UISwitch *labeledSwitch;

@end

في موضح الجدول الخاص بي، أضفت محددا يسمى إذا تم قلب حالة التبديل:

- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   NSString *CellIdentifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]];
   UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
       switch (indexPath.section) {
       case(kMyFirstSection): {
           switch (indexPath.row) {
               case(kMyFirstSectionFirstRow) {
                   [cellOwner loadMyNibFile:@"RootLabeledSwitchTableCell"];
                   cell = (RootLabeledSwitchTableCell *)cellOwner.cell;
                   self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];
                   [self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched) forControlEvents:UIControlEventValueChanged];
                   break;
               }
               // ...
           }
       }
       // ...
   }
}

حتى يعمل هذا المحدد بشكل صحيح:

- (void) keychainOptionSwitched {
   NSLog(@"Switched keychain option from %d to %d", ![self.keychainSwitch isOn], [self.keychainSwitch isOn]);
}

ومع ذلك، لا أستطيع استخدام UISwitch مثال -setOn:animated: طريقة لتهيئة حالتها الأولية:

- (void) updateInterfaceState {
   BOOL isFirstTimeRun = [[[NSUserDefaults standardUserDefaults] objectForKey:kIsFirstTimeRunKey] boolValue];
   if (isFirstTimeRun) {
      [self.keychainSwitch setOn:NO animated:NO];
   }
}

من الاختبار، self.keychainSwitch يكون nil وهو ما يسبب -setOn:animated لا تفعل شيئا، ولكن لا يزال بإمكاني تشغيل التبديل و NSLog سيقوم البيان بطباعة تغييرات الحالة التبديل بشكل صحيح، على سبيل المثال:

[Session started at 2009-08-24 07:04:56 -0700.]
2009-08-24 07:04:58.489 MyApp[29868:20b] keychain switch is: nil
2009-08-24 07:05:00.641 MyApp[29868:20b] Switched keychain option from 1 to 0
2009-08-24 07:05:01.536 MyApp[29868:20b] Switched keychain option from 0 to 1
2009-08-24 07:05:02.928 MyApp[29868:20b] Switched keychain option from 1 to 0

هل هناك شيء أفتقده حول الإعداد self.keychainSwitch في ال UITableView طريقة المندوب؟

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

المحلول

فعلت هذا منذ فترة. يجب عليك تغيير Selctor الخاص بك

[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched:) forControlEvents:UIControlEventValueChanged];

ثم قم بتحديث طريقتك ل

-(void) keychainOptionSwitched:(id)sender {
UISwitch *tempSwitch = (UISwitch *)sender;
}

الآن Tempswitch هو التبديل الذي تم تغييره.

نصائح أخرى

لقد أمضيت الأعمار في الاضطرابات حولها مع Custom ApieTriViewCells مع تسمية بسيطة والتبديل عليها قبل اكتشافها أضف UISWitch كمنظر ملحق. وبعد من المحتمل أنك تدرك هذا على أي حال، وتريد الخلية المخصصة لأسباب أخرى، ولكن فقط في حالة أرادت أن أذكر هذا!

يمكنك القيام بذلك على النحو التالي (في طريقة -TableView: CellFOVERONIDENDEXPATH):

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;

يعتني بت الوصول إلى التحجيم وتحديد المواقع حتى نتمكن من الابتعاد مع CGrectzero.

بعد ذلك، يمكنك بعد ذلك استخدام حدث التحكم في النظام وطريقة Seton كما يلي (ملاحظة أننا نطبق عليه كمؤشر UISWitch الذي نعرفه هو):

[(UISwitch *)cell.accessoryView setOn:YES];   // Or NO, obviously!
[(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector)
     forControlEvents:UIControlEventValueChanged];

امل ان يساعد!

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

 self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];

في الإشارة إلى التبديل في خلية الجدول وأنت لا تحتفظ به، لذلك يجعل ذلك لأن التبديل أصبح نظرا لأنه عندما تنفد الخلية بعيدا، أصبحت Keychainswitch أصبحت نيل نتيجة لذلك وبالتالي فئتها أصبح العضو نيل كذلك. قد ترغب في الاحتفاظ بالبحث عن Keychainswitch ثم عند إعادة بناء الجدول C ELL، احصل على التبديل من Keychainswitch، أو شيء من هذا النوع. أتمنى أن يساعدك هذا

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