Проблема с заполнением UITableView с помощью CustomCell

Я пытаюсь создать UITableView, каждая ячейка которого состоит из вопроса и нескольких кнопок, отображаемых под указанным вопросом, чтобы пользователь мог выбрать один для ответа.

Когда я нахожусь на своей начальной странице и нажимаю кнопку «пройти тест», она переходит к следующему экрану, где находится мой UITableView, но затем происходит сбой.

Я настроил класс CustomCell с IBOutlet для UITextView и семи кнопок UIButton. Я связал UITextView и UIButtons с соответствующими переменными. Вот некоторый код, чтобы показать вам, как я заполняю каждую ячейку. Я не понимаю ошибки на моем скриншоте. Если бы кто-нибудь мог помочь мне с тем, что я делаю неправильно, я был бы очень признателен. Дайте мне знать, если есть дополнительная информация, которую я могу предоставить.

Тествиевконтроллер.h

#import <UIKit/UIKit.h>
#import "Questions.h"
#import "CustomCell.h"

@interface TestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) IBOutlet UITextView *instructions;
@property (weak, nonatomic) IBOutlet UIButton *results;
//@property (strong, nonatomic) IBOutlet *question;
@property (nonatomic, strong) Questions *survey;

-(IBAction)backPressed:(id)sender;
@end

Тествиевконтроллер.м

#import "TestViewController.h"

@interface TestViewController ()

@end

@implementation TestViewController {
    NSDictionary *allQuestions;
}

@synthesize survey;
@synthesize results;
@synthesize instructions;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"Personality Test";
    survey = [[Questions alloc] init];

    // set up question array
    survey.questions = @[@"1. You find it difficult to introduce yourself to other people",
                        @"2. You often get so lost in thoughts that you ignore or forget your surroundings",
                        // many more.....
                       ];

    // set up answers array
    // -1 means unanswered
    // 0 means neutral
    // 1 means weakly agree or weakly disagree
    // 2 means agree or disagree
    // 3 means strongly agree or strongly disagree
    survey.answers = @[[NSNumber numberWithInt:-1],
                       [NSNumber numberWithInt:-1],
                       // many more.....
                      ];

    // set up dictionary of question/answer relationship
    allQuestions = [NSDictionary dictionaryWithObjects:survey.questions forKeys:survey.answers];

    //
    // depending on what question is asked based on categories
    // each question fits into one of the 5:
    // 1. Mind: Introvert or Extravert
    // 2. Energy: Observant or Intuitive
    // 3. Nature: Thinking or Feeling
    // 4. Tactics: Judging or Prospecting
    // 5. Identity: Assertive or Turbulent
    // Each array spot will hold one of the two words on the right

    // set up types array
    survey.types = @[@"neutral",
                     @"neutral",
                    // many more.....
                   ];

    NSString *instr = @"Things to know:\n1. Takes less than 12 minutes.\n2. Answer honestly, even if you don't like the answer. \n3. Try not to leave any 'neutral' answers ";
    //UIFont *instrFont = [UIFont fontWithName:@"HelveticaNeue" size:12];
    //CGSize textviewSize = [instr sizeWithFont:instrFont constrainedToSize:CGSizeMake(300, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    //instructions = [[UITextView alloc] initWithFrame:CGRectMake(100, 30, 300, 100)];
    instructions.text = instr;
    //[self.view addSubview:instructions];

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleDone target:self action:@selector(backPressed:)];
    self.navigationItem.leftBarButtonItem = backButton;
    self.navigationItem.hidesBackButton = NO;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [survey.questions count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *simpleTableIdentifier = @"QuestionCell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    /*
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }
    */

    NSString *que = (NSString *)[survey.questions objectAtIndex:indexPath.row];
    //UITextView *textView = (UITextView *)[cell viewWithTag: 100];
    cell.textView = (UITextView *)[cell viewWithTag: 100];
    cell.textView.text = que;

    return cell;
}

Вот два снимка экрана: один из моих UITableView в StoryBoard, а другой — изображение моих ошибок. введите здесь описание изображения введите здесь описание изображения


person Talcicio    schedule 06.12.2015    source источник
comment
Использует ли ваша пользовательская ячейка XIB? Кроме того, что именно не работает?   -  person Chris Loonam    schedule 07.12.2015
comment
Нет, это не так. Я обновил свой код, чтобы показать вам, что я настроил NSDictionary для хранения двух массивов: один вопрос, а другой ответ.   -  person Talcicio    schedule 07.12.2015
comment
Мои извинения. Я задал вопрос, не объяснив всего. Хотя сейчас он у меня обновлен. Приложение вылетает после того, как я нажимаю кнопку из моего основного VC в VC с моим UITableView   -  person Talcicio    schedule 07.12.2015
comment
Ошибка говорит о том, что вы не возвращаете ячейку из cellForRowAtIndexPath. Убедитесь, что идентификатор повторного использования указан правильно в пользовательской ячейке внутри раскадровки.   -  person Phillip Mills    schedule 07.12.2015


Ответы (1)


Обязательно присвойте ячейке идентификатор повторного использования «QuestionCell» в раскадровке. Вы также должны зарегистрировать пользовательский класс для этого идентификатора в табличном представлении. (см. здесь).

Где-то в или после viewDidLoad...

[self.tableView registerClass:[CustomCell self]
       forCellReuseIdentifier:@"QuestionCell"];
person danh    schedule 06.12.2015
comment
Это помогло, потому что теперь я могу перейти на следующую страницу, но моя таблица все еще не заполняется. В симуляторе iOS он пуст, но я все еще могу прокручивать таблицу. - person Talcicio; 07.12.2015
comment
Я зарегистрировал свой собственный класс в начале viewDidLoad. - person Talcicio; 07.12.2015
comment
Рад, что это помогло. Я думаю, что происходит то, что вы столкнулись со следующей проблемой... вполне вероятно, что-то происходит с настройкой ячейки. В cellForRowAtIIndexPath попробуйте записать строку с именем que и попробуйте записать cell.textView. В последнем случае убедитесь, что фрейм textView находится внутри фрейма ячейки (также зарегистрируйте ячейку). - person danh; 07.12.2015
comment
Я думаю, может быть, что фрейм textView не попадает в фрейм ячейки. Это выглядит сложно для меня в представлении StoryBoard, но границы textView выглядят так, как будто они находятся внутри рамки ячеек. Я загружу лучший скриншот для вас - person Talcicio; 07.12.2015
comment
Я зарегистрировал очередь, и у нее есть соответствующий вопрос. Я зарегистрировал сотовый, и он дал мне некоторую информацию об этом. вот пример: 2015-12-06 18:37:21.297 final_project[42773:7149897] Значение ячейки: ‹CustomCell: 0x7f93d200a800; базовый класс = UITableViewCell; кадр = (0 0; 320 44); слой = ‹CALayer: 0x7f93d0704d00›› - person Talcicio; 07.12.2015
comment
Ширина моего textView составляет 550, а ширина моей ячейки - 560. Кнопки также находятся в рамке моей ячейки. Все имеет ограничения, поэтому они не двигаются. Я не знаю, как еще определить, находится ли рамка textView внутри рамки ячейки. - person Talcicio; 07.12.2015
comment
Похоже, ширина вашей ячейки 320... см. в вашем последнем комментарии, где написано frame = (0 0; 320 44); Это должно быть хорошо. Когда вы регистрируете textView, каково его происхождение? Также попробуйте это для развлечения: cell.textView.backgroundColor = [UIColor redColor]; что-нибудь становится красным? Если нет, то у нас что-то с рамами. - person danh; 07.12.2015
comment
Когда я регистрирую textView, он говорит: «2015-12-06 19:01:42.025 final_project[43053:7179964] TextVIew Value: (null)» - person Talcicio; 07.12.2015
comment
Цвет фона также не меняется на красный. - person Talcicio; 07.12.2015
comment
Таким образом, рамка не является фактическим размером x, y ячейки? когда я регистрирую textView, должно ли это также давать мне размеры фрейма? - person Talcicio; 07.12.2015
comment
null означает, что cell.textView не инициализирован. Есть ли IBOutlet в пользовательской ячейке для textView? - person danh; 07.12.2015