如何在cellForRowAtIndexPath中分配和初始化自定义UITableViewCell?

时间:2015-06-06 04:49:12

标签: ios objective-c uitableview

我不会在这个问题上进入原因,我只是解释我的需要。

我的utilatioon文件中有一个属性,如此...

@property (nonatomic, strong) MyCustomCell *customCell;

我需要在viewDidLoad上初始化它。我通过返回" self.customCell"来返回它作为同一indexPath的cellForRowAtIndexPath中的一行。

然而,它不起作用,我似乎没有在viewDidLoad中正确分配和初始化自定义单元格。 我该怎么做?如果您知道答案,请节省时间,不要再读。

好的,我会把为什么放在这里以防人们好奇。

我有一个表格视图,分为2个部分。第一部分总是显示1行(称之为A)。第二部分总是显示3行(称为X,Y,Z)。

如果点击A行(S0R0 [Section 0 Row]),S0R1中会出现一个新单元格。带有UIPickerView的单元格。用户可以从UIPickerView中选择数据,这将更新单元格A中的选定值。

细胞X,Y& Z都以同样的方式工作。每个都可以被点击,他们将使用各自的UIPickerView打开下面的另一个单元格。

我这样做的方式是,所有这些单元格都是在TableView的Storyboard中创建的,然后拖出View。 IBOutlets是为所有人创建的。然后在cellForRAIP中,我只返回self.myCustomCellA或self.myCustomCellY。

现在,这很有效,但我需要更多的定制。我需要使用自定义单元格,而不仅仅是UITableViewCell。因此,我没有将IBOutlets用于所有单元格(8个单元格,4个(A,X,Y,Z)及其4个隐藏/可切换的UIPickerView单元格),而是在我的实现文件中为它们创建了@properties。但它使用标准的UITableViewCell并没有像之前那样工作。

我不确定我是否正确初始化它们?如何在viewDidLoad中正确初始化它们以便我可以使用它们?

的.m

@interface MyViewController ()

@property (strong, nonatomic) MyCustomCell *myCustomCellA;
...

viewDidLoad中

...
self.myCustomCellA = [[MyCustomCell alloc] init];
...

的cellForRowAtIndexPath

...
return self.myCustomCellA;
...

3 个答案:

答案 0 :(得分:0)

如果只是我理解你的问题,你有3个选择:

  1. 我会非常努力地在代码中使用常规动态单元格生命周期来实现表格视图数据源,而不是静态地 - 当您不可避免地想要修改业务逻辑时,这种方法通常会得到回报。
  2. 如果您确定static table view已足够,可以将此方法与表视图控制器的子类中的重写数据源/委托方法混合,以添加次要的自定义(例如,在需要时隐藏某些单元格)
  3. 或者,您可以使用指定的初始化程序initWithStyle:reuseIdentifier:创建单元格,以在表视图生命周期之外实例化它们,并实现完全自定义逻辑。你应该在viewDidLoad中做什么,你不会在其他地方做。
  4. 如果您的代码遇到特殊问题,请发布一个代码段,以便社区可以为您提供帮助

答案 1 :(得分:0)

我建议你将故事板中的所有单元格(日期选择器位于正确的位置)声明为静态表,然后覆盖tableView:heightForRowAtIndexPath:

定义BOOL以确定选择器可见性及其在表中的位置

#define DATE_PICKER_INDEXPATH [NSIndexPath indexPathForRow:1 inSection:0]

@interface YourViewController ()
@property (assign, nonatomic) BOOL isPickerVisible;
@end

然后设置初始值

- (void)viewDidLoad {
    [super viewDidLoad];

    self.isPickerVisible = YES;
}

覆盖tableView委托方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([indexPath isEqual:DATE_PICKER_INDEXPATH] && !self.isPickerVisible) {
        return 0;
    } else {
        return [super tableView:tableView heightForRowAtIndexPath:indexPath];
    }
}

最后创建切换选择器的方法

- (void)togglePicker:(id)sender {
    self.isPickerVisible = !self.isPickerVisible;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

你可以在tableView中调用:didSelectRowAtIndexPath:

根据你的问题,你可以创建索引路径的对(NSDictionary)和bool(如果它可见)并根据它显示/隐藏它们。

答案 2 :(得分:0)

这就是我要找的东西:

MyCustomCell *cell = (MyCustomCell *)[[[UINib nibWithNibName:@"MyNibName" bundle:nil] instantiateWithOwner:self options:nil] firstObject];