0

indexPath.row を使用して配列からオブジェクトを取得するにはどうすればよいですか? 次のコードを試してみましたが、「signal SIGABRT」が返されます。助けてください

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSString *inde = [NSString stringWithFormat:@"%d", indexPath.row];
    NSNumber *num = [NSNumber numberWithInteger: [inde integerValue]];
    int intrNum = [num intValue];
    NSString *name = [basket objectAtIndex:intrNum];


    cell.textLabel.text = name;
    return cell;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    basket = [[NSMutableArray alloc] init];
    [basket addObject:@"1"];
    [self makeGrid];
 }


- (void)addToBasket:(id)sender {
    NSInteger prodID = ((UIControl*)sender).tag;

    [basket insertObject:[NSNumber numberWithInt:prodID] atIndex:0];
    [self.tableView reloadData];
}

エラーメッセージ:

-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x6866080 2012-05-05 02:29:18.208 app[7634:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x6866080'
4

3 に答える 3

3

なぜあなただ​​けを使用しないのですか

NSString *name = [basket objectAtIndex:indexPath.row];

?

于 2012-05-05T00:25:41.553 に答える
1

メソッドではオブジェクトを配列にaddToBasket入れますが、メソッドではオブジェクトを. コードを機能させるには、文字列への安全な変換を使用できます。NSNumberbasketcellForRowAtIndexPathNSStringbasket

NSString *name = [NSString stringWithFormat:@"%@",[basket objectAtIndex:intrNum]];
于 2012-05-06T07:39:07.587 に答える
0

あなたのコードが

int intrNum = [num intValue];

mayは実際のIndexPath整数ではintrNumありません。アドレスの種類(「88792」など)を返す場合があります。だから、それはあなたのアレイに問題を引き起こすでしょう

cellForRowAtIndexPathこのように配列コードからgetオブジェクトを修正します

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

/* NSString *inde = [NSString stringWithFormat:@"%d", indexPath.row];
NSNumber *num = [NSNumber numberWithInteger: [inde integerValue]];
int intrNum = [num intValue]; */

NSString *name = [basket objectAtIndex:indexPath.row];


cell.textLabel.text = name;
return cell;

}

そして、あなたは私が上で述べた理由のようにaddToBasket使うべきではありません。numberWithIntint

- (void)addToBasket:(id)sender {
    NSInteger prodID = ((UIControl*)sender).tag;

    // [basket insertObject:[NSNumber numberWithInt:prodID] atIndex:0];
    [basket insertObject:[NSNumber numberWithInteger:prodID] atIndex:0];    

    [self.tableView reloadData];
}

お役に立てば幸いです。

于 2012-05-06T08:37:05.603 に答える