0

ユーザーがスワイプしたときに行を削除しようとしています。このエラーが発生して、気が狂いました。その理由を突き止めるために、過去 3 時間を費やしてきました。しかし、私はこれまでのところ手がかりがありません。

これを達成するための私のコードは次のとおりです。
.h で

  #import <UIKit/UIKit.h>
  #import "CustomCell.h"
  @interface FollowersTableViewController : UITableViewController
  @property (nonatomic,strong)NSMutableArray *arrayWithUser ;
  @end

そして.miにはこのコードがあります。

#import "FollowersTableViewController.h"
@implementation FollowersTableViewController
@synthesize  arrayWithUser ;
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}
    -(void)viewDidLoad
    {
        [super viewDidLoad];
        NSDictionary *dicUrlList= [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Urls" ofType:@"plist"]];
        NSString *baseURl = [dicUrlList objectForKey:@"urlWithUser"];
        baseURl = [baseURl stringByAppendingFormat:@"getfollowers"];
        NSURL *urlToGetFollowers = [NSURL URLWithString:baseURl];
        NSURLRequest *request = [NSURLRequest requestWithURL:urlToGetFollowers];
        NSError *error = nil ; 
        NSURLResponse *response = nil ; 
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        arrayWithUser = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

    } 
    - (void)viewDidUnload
    {
        [super viewDidUnload];
    }
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }        
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {

        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    { 
        return [arrayWithUser count];
    }   
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        static NSString *MyIdentifier = @"Cell";
        CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
        if (customCell == nil) 
        {
            customCell = [[CustomCell alloc] initWithFrame:CGRectMake(0, 0, 320, 50)] ;
        }
        NSDictionary *dicWithUser = [arrayWithUser objectAtIndex:indexPath.row];
        NSString *photoUrl = [dicWithUser objectForKey:@"profilePhotoUrl"];
        if(![photoUrl isEqualToString:@""])
            [customCell.thumbnail setImageWithURL:[dicWithUser objectForKey:@"profilePhotoUrl"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] ];
        else 
        {
            [customCell.thumbnail setImage:[UIImage imageNamed:@"placeholder.png"]];
        }
        customCell.titleLabel.text = [dicWithUser objectForKey:@"username"];
        UIButton *buttonFollow = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [buttonFollow setTitle:@"Follow" forState:UIControlStateNormal];
        CGRect frame = buttonFollow.frame ; 
        frame = CGRectMake(200, 10, 60, 30);
        buttonFollow.frame = frame ;
        buttonFollow.tag = indexPath.row ;
        [buttonFollow addTarget:self action:@selector(followButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        customCell.accessoryView = buttonFollow ;
        return customCell;    
    }   
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 60 ;
    }
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Return NO if you do not want the specified item to be editable.
        return YES;
    }
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            // Delete the row from the data source
            [arrayWithUser removeObjectAtIndex:indexPath.row];
        }    
    }

これまでのところ、削除ボタンは表示されていますが、押すとこのエラーが表示されます

[__NSCFArray removeObjectAtIndex:]: 不変オブジェクトに送信される変更メソッド。

私はすでに を使用NSMutableArrayしているので、なぜこのエラーが発生するのかわかりません。

私はすでにプロジェクトをきれいにしようとしています。違いはありませんでした。

4

5 に答える 5

0

NSArray を返す Json 呼び出し。mutableCopy を作成できるので、「removeAtIndex..」メソッドを使用できます。

NSArray *rData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
arrayWithUser = [rData mutableCopy];
于 2012-07-29T13:57:25.420 に答える
0

下の行を置き換えるだけです

arrayWithUser = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

arrayWithUser = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

Apple のドキュメントから:
NSJSONReadingMutableContainers : 配列と辞書が可変オブジェクトとして作成されることを指定します。
NSJSONReadingMutableLeaves : JSON オブジェクト グラフ内のリーフ文字列が NSMutableString のインスタンスとして作成されることを指定します。

于 2013-05-08T14:39:40.957 に答える
0

JSON 呼び出しからの arrayWithUser への割り当ては、viewDidLoad で NSMutableArray ではなく NSArray を返しています。それを修正します。

于 2012-07-29T10:57:34.540 に答える
0

実際には、配列 (arrayWithUser) は JSONObjectWithData によって返される配列を強く指しています。返された配列の所有権がないため、そのオブジェクトを削除することはできません。その配列の所有権を取得することをお勧めします。

arrayWithUser = [[NSMutableArray alloc]arrayByAddingObjectsFromArray:[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]];
于 2012-07-29T15:39:09.703 に答える