0

次の行でエラーが発生しています。

cell1.textLabel.text = [settings objectAtIndex:indexPath.row];

そして、これは私が受け取ったキャッチされていない開始エラーです:

Terminating app due to uncaught exception 'NSRangeException',
    reason: '-[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
First throw call stack:
(0x2265012 ... 0x21a5 0x1)
libc++abi.dylib: terminate called throwing an exception
(lldb)

これが私のコードです:

.h:

@interface ViewController : UIViewController <UITableViewDataSource ,UITableViewDelegate>{

    //Settings Table
    IBOutlet UITableView *settingTable;
    NSMutableArray *settings;
}

@property (nonatomic, retain) UITableView *settingTable;
@property (nonatomic, retain) NSMutableArray *settings;

.m:

@synthesize settingTable;
@synthesize settings;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (!settings) {
        return 0;
    }

    if ([settings count] > 0){
        return [settings count];
    }
    else
        return 0;
}

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

        NSLog(@"%@", settings);

        UITableViewCell *cell1 = [settingTable dequeueReusableCellWithIdentifier:@"MainCell1"];
        if (cell1 == nil) {
            cell1 = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell1"];
        }

        cell1.textLabel.text = [settings objectAtIndex:indexPath.row];
        return cell1;
   }

// ...

- (void)viewDidLoad
{
    [super viewDidLoad];

    settingTable.delegate = self;
    settingTable.dataSource = self;

    //settings table
    settings = [[NSMutableArray alloc] initWithObjects:@"Downloads", @"Queue", @"FAQ", nil];
}

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


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
4

5 に答える 5

4

問題は、UITableView で静的セルを使用していることです。ストーリーボードの行数を増やすだけです。プログラムでテーブル ビューに追加できるセルの最大数です。

ストーリーボードを使用していないことがわかりませんでした。しかし、それを使用している人にとっては私の答えは正しいです。

于 2013-09-11T19:51:23.007 に答える
1

設定を次のように初期化するように変更します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    settingTable.delegate = self;
    settingTable.dataSource = self;
}

- (NSMutableArray *)settings
{
    if (!_settings) settings = [[NSMutableArray alloc] initWithObjects:@"Downloads", @"Queue", @"FAQ", nil];
    return _settings;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return settings.count;
}

このようにして、設定オブジェクトは常に初期化されます。

于 2013-09-11T19:46:55.453 に答える
1

ストーリー ボードと静的テーブルを使用している場合は、次の 2 つのいずれかが機能します。

1>セルの数は、行数を返すストーリーボードで同じでなければなりません。

また

2>ストーリーボードに1つのセルを保持したい場合は、indentationLevelForRowAtIndexPathデータソースメソッドを実装します。スタックをトレースすると、実装する必要があるさまざまなデータソースメソッドが見つかります。動的プロトタイプテーブルで処理されるためです。自己ですが、静的ではデータソースメソッドを実装する必要があります

于 2016-06-30T08:16:49.543 に答える
-1

次の行に変更するだけです。

cell1.textLabel.text = [settings objectAtIndex:indexPath.row-1];
于 2013-09-11T20:57:07.147 に答える
-1

コードをクリーンアップするには、次のことを実行できます。

1. cellForRowAtIndexPath メソッドで、

if([settings count]>0)

それ以外の

if(settingTable)

2.numberOfRowsInSection メソッドで、

if ([settings count] > 0){
    return [settings count];    
}
else
    return 0;

それ以外の

if(!settings){
    return 0;
}
if ([settings count] > 0){
    return [settings count];

}
else
    return 0;

コードの上記の変更により、コードが完全に機能するようになります。

于 2013-09-11T19:44:50.190 に答える