Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么';t如果(单元格==nil)工作?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 为什么';t如果(单元格==nil)工作?

Ios 为什么';t如果(单元格==nil)工作?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我试图使用两种不同的重用标识符,让用户能够在不使用segue的情况下输入数据…(我只是觉得这很好) 这是我第一次尝试的: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if(addC && indexPath.row == 0 && indexPath.section == 0){

我试图使用两种不同的重用标识符,让用户能够在不使用segue的情况下输入数据…(我只是觉得这很好)

这是我第一次尝试的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(addC && indexPath.row == 0 && indexPath.section == 0){
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        UITextField *txtField = [[UITexField alloc] initWithFrame:CGRectMake(10, 7, 260, 30);
        [cell addsubview:txtField];
        cell.txtField.delegate = self;
        cell.txtField.text = nil;
        return cell;
但是,我注意到,如果我多次使用该字段,textfield将重复,并在下面留下旧值。 因此,经过一些研究之后,我补充道:

if(cell == nil){

}
在txtField初始化期间,但它不会启动。我最终完全通过创建一个单独的UITableViewCell类来解决这个问题,但现在我尝试添加 并将我的单元格从UITableViewCell更改为CustomTableViewCell

此自定义实用程序附加到“我的表”中,初始化需要您使用

if (cell == nil) {
        NSMutableArray *leftUtilityButtons = [NSMutableArray new];
        NSMutableArray *rightUtilityButtons = [NSMutableArray new];

        [leftUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:0.07 green:0.75f blue:0.16f alpha:1.0] 
                        icon:[UIImage imageNamed:@"check.png"]];
        [leftUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:1.0f green:1.0f blue:0.35f alpha:1.0] 
                        icon:[UIImage imageNamed:@"clock.png"]];
        [leftUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:1.0f green:0.231f blue:0.188f alpha:1.0] 
                        icon:[UIImage imageNamed:@"cross.png"]];
        [leftUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:0.55f green:0.27f blue:0.07f alpha:1.0] 
                        icon:[UIImage imageNamed:@"list.png"]];

        [rightUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:0.78f green:0.78f blue:0.8f alpha:1.0]
                        title:@"More"];
        [rightUtilityButtons sw_addUtilityButtonWithColor:
                        [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] 
                            title:@"Delete"];

        cell = [[SWTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                        reuseIdentifier:cellIdentifier 
                        containingTableView:_tableView // For row height and selection
                        leftUtilityButtons:leftUtilityButtons 
                        rightUtilityButtons:rightUtilityButtons];
        cell.delegate = self;
}
如果我还没有实现这个插件,但之前我在研究我的问题,现在我还没有发现任何东西

我也试过了

if (cell.contentView == nil)

if (cell.contentView.subViews == nil)

if (cell.subViews == nil)

但由于某些原因,它不会像预期的那样第一次开火。我做错了什么?

如果
cell
nil
,则表视图中没有返回单元格。因此,您添加的
txtField
将不会产生任何效果

听起来你想找的是找回一个已经有文本字段的单元格?因此
单元格
明确地不
nil

大多数程序使用自定义的
UITableViewCell
子类,这样子视图的生命周期自然与单元格本身相匹配。就你而言:

  • 您应该添加到
    单元格。contentView
    ,而不是直接添加到
    单元格
  • 然后,您可能可以通过检查
    [cell.contentView.subviews count]
    来判断是否添加了任何内容,因为内容视图的观点是,表视图单元格作为操作的一个普通部分,可以添加或从其自身删除任何其他子视图

  • 第一个问题的答案(为什么从未调用
    cell==nil
    ):

    dequeueReusableCellWithIdentifier:forindexath:
    dequeueReusableCellWithIdentifier:
    的文档说明:

    如果为指定的标识符注册了一个类,并且必须创建一个新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:method来初始化单元格。对于基于nib的单元,此方法从提供的nib文件加载单元对象。如果现有单元格可供重用,此方法将调用该单元格的prepareForReuse方法

    这意味着,如果您使用
    registernb:forCellReuseIdentifier:
    registerClass:forcellreuseidentier:
    来注册重用标识符,那么您的单元格将为零,因为您从未手动实例化一个,您将永远没有机会自己实例化一个

    有几种方法可以解决这个问题,但最好、最有效的方法是创建一个子类
    UITableViewCell
    并在子类中添加您想要的任何自定义子视图(如果您正在使用),每次重新使用子视图时只需设置子视图的属性

    因此,基本上只需将所有自定义子视图添加和初始化代码移动到
    initWithStyle:reuseIdentifier:

    然后您的
    tableView:cellForRowAtIndexPath:
    方法将被重写为如下内容:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(addC && indexPath.row == 0 && indexPath.section == 0)
        {
            MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
            cell.txtField.delegate = self;
            cell.txtField.text = nil;
            return cell;
        }
    }
    

    如果我能投你一票,我会的,这正是我解决第一个问题的方式,但下一个问题,如果你看一下SWTableViewCell,他用if(cell==nil)来复制它。因为它不会被称为我必须重做他的整个项目几乎使用它?目前还没有解决办法,只需将代码放入
    initWithStyle:reuseIdentifier:
    中,它仍然可以正常工作。我将用一个例子来编辑我的答案,说明这是如何工作的。在尝试对其进行模拟之后,默认的
    SWTableViewCell
    初始值设定项希望引用
    UITableView
    ,不易从该点访问。因此,我建议您放弃已注册的单元格,并对代码进行结构化,以允许手动初始化单元格,如文档中的代码示例所示。。。。就像使用静态单元格。。。我不知道这是否可行数据源是sqlite通过核心数据我确信有一个解决方案使静态单元格像可重用的一样工作,但是他们有一个故事板的更新版本它使用了很多不同的自定义视图。。。我只是想知道我想要什么和不想要什么,然后在我自己的项目中重新制作。每次加载重用时,您的代码仍然会触发,不过我现在明白了原因。虽然它确实阻止了翻倍,所以谢谢你