Путаница с раскадровкой и источником данных UITableView: как отображать текст в ячейке - PullRequest
1 голос
/ 05 марта 2012

Итак, мне дали задание в моем классе мобильных приложений: создайте приложение для цветной игры для iphone (описание того, как работает игра, находится вверху вставленного файла viewcontroller.h ниже.)

Я очень плохо знаком с Objective-C и какао, но сумел устранить неполадки и исправить многие вещи в этом приложении.У меня сейчас проблема в том, что я не знаю, как правильно инициализировать и отправить UITableViewCells в представление.Я запутался, потому что все учебники, которые я нашел в Интернете, используют методы источника данных для изменения различных атрибутов UITableView и ячеек.Я не уверен, как эти методы будут взаимодействовать с элементами управления, которые я уже разместил.Я в замешательстве, потому что я добавил их в файл раскадровки, а не определяя атрибуты табличного представления с помощью кода источника данных.

Моя непосредственная проблема заключается в том, что моя программа не будет отображать правильный текст для метки текста и метки 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!"];
    }
}

Методы источника данных UITableView, которые я вызвал внизу файла viewcontroller.m:

    #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 ]

1 голос
/ 05 марта 2012

Ваш метод действия должен обновить модель данных (что, я думаю, так и происходит, поскольку он меняет ваш массив listOfGuesses).Затем вам необходимо сообщить вашему табличному представлению о том, что вы добавили или обновили строки, чтобы он мог повторно загрузить их для вас - обратитесь к документации UITableView для перезагрузки данных или определенных строк.

Создание ячейки вне методов источника данных не позволит этой ячейке появиться в вашей таблице.

В настоящий момент я предполагаю, что в вашем табличном представлении есть 6 пустых ячеек?Вам необходимо заполнить текстовые и подробные метки в вашем методе cellForRowAtIndexPath.Разница в том, что теперь есть раскадровки, заключается в том, что вам не нужно делать бит if (cell == nil), если вы установили идентификатор повторного использования в ячейке прототипа раскадровки, тогда он будетсделать все это для вас.Таким образом, ваш метод 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 для этого.
1 голос
/ 05 марта 2012

Обычно текст задается в каждой ячейке путем доступа к свойству setText:

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

или

[[cell textLabel] setText:someNSString];

или с обозначением .dot

cell.textLabel.text = someNSString;

return cell; 

Кстати, это делается по методу:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...