iOS - cellForRow ... IF逻辑

时间:2012-08-30 20:06:03

标签: objective-c ios cocoa-touch uitableview if-statement

我有一个numberOfSections ...方法,如下所示:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    BOOL showContacts = self.selectedReminderMessageService != RMReminderMessageServiceTwitter ? YES : NO;

    if (self.isEditing) {

        if (showContacts) {

            return 5;

        } else {

            return 4;
        }

    } else {

        if (showContacts) {

            return 4;

        } else {

            return 3;
        }
    }
}

我应该如何创建cellForRowAtIndexPath ...方法?我是否必须列出所有可能的配置:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    BOOL showContacts = self.selectedReminderMessageService != RMReminderMessageServiceTwitter ? YES : NO;

    NSInteger section = [indexPath section];

    if (self.isEditing) {
         if (showContacts) {
              if (section == 0) {
                  // repeat to section 4 with else if's
              }
         } else {
              if (section == 0) {
                  // repeat to section 3 else if's
              }
         }
     } else {
         if (showContacts) {
              if (section == 0) {
                  // repeat to section 3 else if's
              }
         } else {
              if (section == 0) {
                  // repeat to section 2 else if's
              }
         }
     }
}

这可以以更有效的方式制作吗?

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,最后创建了一个枚举器和一个给出indexPath(或section)的方法,返回它的部分。

这样,无论何时你需要找到你在给定索引处理的单元类型(例如,创建和选择单元格),你只需要询问该方法的类型。

示例:

typedef enum {
    SectionNone = 0,
    SectionContacts,
    SectionOptions,
} Section; // do a more appropriate name

- (Section)sectionForSection:(NSInteger)section {
    // evaluate your state and return correct section
}

所以在你的cellForRow中...你可以去

Section sect = [self sectionForSection:indexPath.section];
switch (sect) {
    case SectionContacts: {
        // work with contact cell
        break;
    }
    case SectionOptions: {
        // work with options cell
        break;
    }
    // etc
}

答案 1 :(得分:0)

因此,当isEditing为true时会出现一个附加部分,当showContacts为true时会出现一个附加部分,如果它们各自的条件为false,则这些部分不会显示。我有这个权利吗?然后是你的问题,如何使它在你的tableView:cellForRowAtIndexPath:方法中有更少的if/else

这就是我要做的事情:首先,总是从numberOfSectionsInTableView返回相同数量的部分 - 在这种情况下为5。然后,在tableView:numberOfRowsInSection:中检查条件并在其为假时返回0,或者如果为真则返回适当的行数。

现在,第0部分始终是您的“联系人”部分,第4部分始终是“添加行”部分(或您希望将它们放入的任何顺序)。最后,在您的tableView:cellForRowAtIndexPath:方法中,您只需要检查您所在的哪个部分,以制作正确的“类型”单元格。如果该部分中没有行,则永远不会执行该位代码。

if (indexPath.section == 0) {
  //contacts cell 
} else if (indexPath.section == 1) {
  //cell for whatever section 1 is
} else if (indexPath.section == 2) {
  //etc.
} //etc.

如果你愿意,你可以将它与Ismael的命名结合起来,尽管我从来没有发现需要做更多的事情而不是在评论中指出这一部分。