0

UITableView in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathviewDidLoad メソッドで初期化した配列をメソッドに入力しようとして います。

self.questionsArray = [NSArray arrayWithObjects:@"Q1",@"Q2",@"Q3",@"Q4",@"Q5",@"Q6",@"Q7",@"Q8",@"Q9",@"Q7",@"Q8",@"Q9",@"Q10",@"Q11"];

さまざまなセクションを実装し、識別子を使用してセルを再利用する方法を理解しています。私が見たほとんどの例のように、私は次のように試しました question.text = [NSString stringWithFormat:@"%d. %@", indexPath.row ,[self.questionsArray objectAtIndex:indexPath.row]];

Q1 1. Q2 2. Q3 3. Q4 4. Q5 5. Q6 0. Q1 2. Q2 ....

すべての質問 (NSString) を TableView にロードするのを手伝ってください。私はindexPath.rowを台無しにしています。理解するのは非常に難しいです。indexPath を効果的に処理するためのベスト プラクティスに関するヒント。

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    switch (section) {
        case 0:
            return [self.questionsArray count];
        case 1:
            return 1;
        default:
            return 0;
    }
}    
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{        
    if (indexPath.section == 0) {           
        static NSString *QuestionCellIdentifier = @"QuestionCellIdentifier";

        UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:QuestionCellIdentifier];

        if (cell == nil) {
                [[NSBundle mainBundle] loadNibNamed:@"QuestionCell" owner:self options:nil];
            }
            cell = questionCell; // IBoutlet    
            self.questionCell = nil;              
        }

           question.text = [NSString stringWithFormat:@"%d.  %@", indexPath.row ,[self.questionsArray objectAtIndex:indexPath.row]];

        return cell;    
    }       
    else if (indexPath.section == 1){

        static NSString *CustomCellIdentifierMore = @"CustomCellIdentifierMore";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CustomCellIdentifierMore];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CustomCellIdentifierMore] autorelease];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            switch (indexPath.row) {

                case 0:
                    cell.textLabel.text=@"Select";
                    break;                

                default:
                    break;
            }
        }   

        return cell;
    } 
    return nil;
}  
4

3 に答える 3

1

cellForRowAtIndexPath は、セルを順番にロードすることが保証されておらず、特定のセルを更新するために呼び出されます。numberOfRowsInSection メソッドも提供する必要があります。次に例を示します。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.tableData count];
}

セルは正しく表示されていますか、それとも単に nslog が紛らわしい出力を生成しているのでしょうか?

于 2012-04-24T01:44:27.327 に答える
0

次のように、viewDidLoad で questionArray を作成した後、tableView で reloadData を呼び出してみてください。

self.questionsArray = [NSArray arrayWithObjects:@"Q1",@"Q2",@"Q3",@"Q4",@"Q5",@"Q6",@"Q7",@"Q8",@"Q9",@"Q7",@"Q8",@"Q9",@"Q10",@"Q11"];
//or whatever your property for the tableview is called.
[self.tableView reloadData];
于 2012-04-24T01:54:35.280 に答える
0

cellForRowAtIndexPath の実装は少しファンキーです。まず、indexPath.section == 0 条件の中括弧が一致しません。次に、返されるセルのテキストを設定している場所がわかりません。question.text に割り当てるものは何でも cell.textLabel.text に割り当てる必要があります。3 番目に、indexPath.section == 1 条件の場合、セルが nil の場合にのみテキストを設定しています。テーブル ビューは、セル管理に関して非常にスマートです。スクロールによってセルが表示されなくなると、新しいセルを完全に作成するのではなく、そのセルを再利用します。そのため、セルをデキューするたびに、常に nil になるとは限りません。そのため、if (cell == nil) ループの外側でセル テキストを設定する必要があります。

于 2013-04-15T03:50:24.717 に答える