1

我在 iOS 应用程序(没有 IBOutlet)上有一个 UITableView,它在它自己的类中被启动和构建。tableview 的宽度基于文本字段的宽度,并且具有固定的高度。tableview 周围还有一个细黑框。

启动语句如下:

-(id)initWithFrameFromField:(UITextField *)textField {
    CGRect theFrame;
    theFrame.origin.x = textField.frame.origin.x;
    theFrame.origin.y = (textField.frame.origin.y + textField.frame.size.height);

    theFrame.size.width = textField.frame.size.width;
    theFrame.size.height = 100;

    self.tableView = [self.tableView init];
    self.tableView.frame = theFrame;

    //Border
    CALayer *layer = self.tableView.layer;
    layer.borderWidth = 2;
    layer.borderColor = [[UIColor blackColor] CGColor];
    layer.cornerRadius = 10;
    layer.masksToBounds = YES;

    self.tableView.userInteractionEnabled = YES;

    self.tableView.dataSource = self;
    return self;
}

此外,这里是 cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //NSArray *contentForThisRow = [[self currentArray] objectAtIndex:[indexPath row]];
    NSString *uniqueIdentifier = @"CellIdentifier";
    SuggestionBoxCell *cell = nil;
    [cell.contentView setUserInteractionEnabled:NO];
    cell = (SuggestionBoxCell *) [self.tableView dequeueReusableCellWithIdentifier:uniqueIdentifier];
    if(cell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle]loadNibNamed:@"SuggestionBoxCell" owner:nil options:nil];
        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[UITableViewCell class]])
            {
                cell = (SuggestionBoxCell *)currentObject;
                break;
            }
        }

    }
    if (indexPath.row == [suggestions getNumberOfEntries]) {
        cell.textBox.text = @"Search History";
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    } else {
        //Display entry
    }

    return cell;
}

显示单元格内容的所有代码都有效,并且数据源功能似乎没有任何问题。

让我大吃一惊的是应用商店版本(当前发布的版本是在 Xcode 4 中编译的)在 iOS7 上运行良好,我可以单击表格单元格条目,但是如果我采用完全相同的代码(没有修改完全)并在 Xcode 5 中编译并在 iOS7(模拟器和设备)上运行它我无法单击表格条目。更复杂的是,我可以在 iOS 6 上运行 Xcode 5 版本,没有任何问题。

这就是我卡住的地方,我已将我的 tableviewcell nib 文件转换回 Xcode 4.3 格式并再次转换回来,并确保所有“启用用户交互”布尔值都应该是无济于事的。

这是我的 didSelectRowAtIndexPath 的副本,用于特定的 tableview 和参考,这在被分配为委托的封装 UIViewController 中调用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == ([tableView numberOfRowsInSection:0]-1)) {
        //If the user clicks the last row in the table, go to search history
        searchHistory = [[SearchHistoryViewController alloc]initWithNibName:@"SearchHistoryView" bundle:[NSBundle mainBundle]];
        [MSUtilities presentViewController:searchHistory withParent:self];
    } else {
        //Change text in text field
    }
}

这就是我卡住的地方。我已经为此工作了很多小时,并查看了许多 stackoverflow 帖子。有什么建议/解决方案/想法吗?

编辑:添加说明和简化代码。

EDIT2:按要求添加了 cellForRowAtIndexPath。

4

1 回答 1

0

你在这里做错了很多事情。最明显的是您没有在 init 函数中调用 super 。您的 init 函数应如下所示:

- (id)initWithFrameFromField:(UITextField *)textField
{ 
    self = [super initWithStyle:UITableViewStylePlain];
    if (self) {
        // Do custom init here
        _deferredFrame = textField.frame;
    } 
    return self;
}

下一个问题是您不应该创建视图,直到您-loadView-viewDidLoad. 在这种情况下,您最好在 中执行大部分初始化代码-viewDidLoad,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.frame = self.deferredFrame;

    CALayer *layer = self.tableView.layer;
    layer.borderWidth = 2;
    layer.borderColor = [[UIColor blackColor] CGColor];
    layer.cornerRadius = 10;
    layer.masksToBounds = YES;
}

最后一个问题是,在您的示例中,您将视图控制器设置为 UITableView 的数据源,而不是委托。在您的 init 中正确调用 super 并让您的 -loadView 方法为您创建 UITableView 可以为您解决该问题。

于 2013-10-20T18:55:25.077 回答