与故事板和UITableView数据源混淆:如何在单元格中显示文本

时间:2012-03-05 00:22:01

标签: objective-c cocoa-touch uitableview

所以我在移动应用程序类中获得了一项任务:为iphone制作一个彩色游戏应用程序。(游戏工作原理的描述位于下面粘贴的viewcontroller.h文件的顶部。)

我是Objective-C和cocoa的新手,但已成功解决并修复了此应用中的很多问题。我现在遇到的问题是我不知道如何正确初始化并将UITableViewCells发送到视图。我很困惑,因为我在网上找到的所有教程都使用数据源方法来改变UITableView和单元格的不同属性。我不确定这些方法将如何与我已经放置的控件进行交互。我很困惑,因为我是通过storyboard文件添加它们的,而不是通过使用数据源代码定义tableview属性。

我的直接问题是我的程序不会向单元格textlabel和detailtextlabel显示正确的文本。

我在网上到处都看过UITableView和UITableViewCell教程,但它们都来自几年前,而且我不确定故事板的出现是否改变了我对待这些控件的方式。

我编写的所有代码都在viewcontroller.m或viewcontroller.h文件中。

ViewController.m文件中的方法,应调用单元格并显示文本和详细信息文本:

-(IBAction)enterClicked
{
//On enter- send instance colors to the colorTable row[i], perform comparisons and append     the resulting symbols to the instanceResults String. Send instanceResults string to the resultTable     row[i]. When game counter reaches 6, gameOver. If on comparisons check, the instanceColors are     the same as the gameColors, then the player wins.

    [self checkForLoss];

    if(!self.gameOver)
    {
    resultOfGuess = [self comparePlayerInputToGameColors:guessColors];

    [listOfGuesses addObject:guessColors];
    [listOfOutcomes addObject:resultOfGuess];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_numberOfTurnsPlayed inSection:0];    

        UITableViewCell *thisCell = [[UITableViewCell alloc]      initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

        thisCell.textLabel.text = [self.listOfGuesses lastObject];
        thisCell.detailTextLabel.text = [self.listOfOutcomes lastObject];

    [guessColors setString:@""];

    if([self checkForWin:resultOfGuess])
        [UpdateLabel setText:@"You have won!"];
    else
        [UpdateLabel setText:@""];

    self.colorCounter = 0;
    self.isStepOne = YES;
    _numberOfTurnsPlayed++;
    }

    else
    {
        if([self checkForLoss])
        [UpdateLabel setText:@"You have lost!"];
    }
}

我在viewcontroller.m文件底部调用的UITableView数据源方法:

    #pragma mark - UITableViewDataSource protocol


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if(section == 0)
        return @"Guesses:  Results:";
    return 0;
}

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 6;
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1     reuseIdentifier:CellIdentifier];
    }
    return cell;
}  

所以我的问题是:如果我通过故事板创建控件,我可以使用数据源方法更改控件的属性吗?如何在uitableview的单元格中正确显示文本?

编辑/更新:谢谢,我已经使用了你的建议jrturton,但现在我发现了一些可能是我问题根源的特殊情况。在我的viewController.h文件中,我已经从

更改了标题

ViewController:UIViewController到ViewController:UITableViewController

认为我在viewcontroller文件中调用的数据源方法必须能够调用我在头文件中调用的类的相同方法和属性 - 另外,我在其他UITableView教程文件中看到了这一点。

问题是,当我将标题更改为read-- ViewController:UITableViewController时 - 我尝试编译,我收到此错误:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:' - [UITableViewController loadView]加载了“2-view-3”笔尖,但没有得到UITableView。 如果我只使用头文件中的UIViewController,它编译得很好。

有什么想法吗?

进一步更新:我在故事板中注意到唯一可用的ViewController对象是UIViewController对象,而在我见过的其他教程文件中,这个ViewController对象是一个UITableViewController对象。我想这是我的问题,但我似乎无法将我的UIViewController对象切换到UITableViewController。我所能做的就是创造一个新的,我想象的不是我想要的。

2 个答案:

答案 0 :(得分:1)

通常,通过访问setText属性在每个单元格中设置文本:

[[cell textLabel] setText:@"static string"];

[[cell textLabel] setText:someNSString];

或使用.dot表示法

cell.textLabel.text = someNSString;

return cell; 

BTW这是在方法中完成的:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:

答案 1 :(得分:1)

您的操作方法应该更新数据模型(我认为它会更新,因为它会更改您的listOfGuesses数组)。然后,您需要让表视图知道您已添加或更新了行,以便它可以为您重新加载它们 - 检查UITableView文档以重新加载数据或特定行。

在数据源方法之外创建单元格不会让该单元格出现在表格中。

目前我猜你桌面视图中有6个空单元格?您需要在cellForRowAtIndexPath方法中填充文本和详细信息标签。现在有故事板的区别是你需要做if(cell == nil)位,只要你在storyboard原型单元格中设置了重用标识符然后它会为你做所有这些。因此,您的cellForRowAtIndexPath方法可以简化为:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{     
    // This will dequeue or create a new cell based on the prototype in your storyboard    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    // Put your actual configuration here based on your model array
    cell.textLabel.text = @"Hello";     

    return cell; 
} 

进一步提示(这是作业,所以我没有提供完整的样本)

    上面方法中的
  • 'indexPath.row`将为您提供单元格引用的模型数组的索引
  • 您已经将表定义为有6行,但是您要在模型数组中添加项目 - 所以当表格要求第5行,而您的模型只有3个条目时,您需要处理此问题。请考虑动态更改表中的行数,并使用表视图方法指示已添加新行。再次,请参阅UITableView文档。