Obj-C UITable 没有填充 MutableArray

Posted

技术标签:

【中文标题】Obj-C UITable 没有填充 MutableArray【英文标题】:Obj-C UITable not populating with MutableArray 【发布时间】:2019-04-19 15:31:30 【问题描述】:

我有一个在应用启动时加载的数组,它会获取正确的数据并填充数组,但是一旦我转到 tableviewcontroller,它就会说数组为空。

这是我获取数据的地方

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

    NSMutableArray *tableDicsArrayTickets;
    NSMutableArray *dictionaryStack;
    NSMutableString *textInProgress;
    NSError *errorPointer;

@property (strong, nonatomic) NSMutableArray *tableDicsArrayTickets;
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSString *photo_URL;
+(NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer;
+(NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer;
+(AppDelegate *) getInstance; 

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.tableDicsArrayTickets = [[NSMutableArray alloc] init];

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:nil delegateQueue:[NSOperationQueue mainQueue]];

    NSURL *url = [NSURL URLWithString:@"http://MYURLexample.php"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    NSString *deviceCode = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    NSString *post = [[NSString alloc] initWithFormat:@"parameter=%@", deviceCode];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[post dataUsingEncoding:NSUTF8StringEncoding]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
        NSLog(@"Response:%@ %@\n", response, error);
        if(error == nil)
        
            NSString *text =[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

            NSLog(@"Data = %@",text);

            NSDictionary *dics = [[NSDictionary alloc]initWithDictionary:[AppDelegate dictionaryForXMLString:text error:nil]];

            NSLog(@"dics is %@", dics);
            [self.tableDicsArrayTickets addObject:[[dics valueForKey:@"response"] valueForKey:@"text"]];
            NSLog(@"Array2 is %@", self.tableDicsArrayTickets);

        
    ];
    [dataTask resume];

ViewController.h

@interface HistoryViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

    AppDelegate *mainDelegate;

@property (strong, nonatomic) AppDelegate *mainDelegate;

ViewController.m

#pragma
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [mainDelegate.tableDicsArrayTickets count];



-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    return 60;


-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


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


    NSMutableArray *array = mainDelegate.tableDicsArrayTickets;
    NSString *cellIdentifier = @"Cell";

    PhotoTableViewCell *cell = (PhotoTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell == nil)
    
        cell = [[PhotoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];


    
    NSLog(@"Array is %@", [[array objectAtIndex:indexPath.row] objectForKey:@"text"]);
    cell.ticketNumber.text = [[array objectAtIndex:indexPath.row] objectForKey:@"text"];
    return cell;

我在获取数组的数据时没有问题,只要我最终进入带有表的视图控制器,数组就会变为空。

【问题讨论】:

您必须显示获取数据的代码,以及如何实例化mainDelegate @DonMag 那是你需要的吗? 【参考方案1】:

我认为你做错了很多事情......

第一:

// AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

    // this should NOT be here
    NSMutableArray *tableDicsArrayTickets;

    NSMutableArray *dictionaryStack;
    NSMutableString *textInProgress;
    NSError *errorPointer;

@property (strong, nonatomic) NSMutableArray *tableDicsArrayTickets;
// ...

这应该会给你一个编译警告:

autosynthesized property 'tableDicsArrayTickets' will use synthesized instance
variable '_tableDicsArrayTickets', not existing instance variable 'tableDicsArrayTickets'

同理:

//HistoryViewController.h

@interface HistoryViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

    // this should NOT be here
    AppDelegate *mainDelegate;

@property (strong, nonatomic) AppDelegate *mainDelegate;

应该给你的:

autosynthesized property 'mainDelegate' will use synthesized instance 
variable '_mainDelegate', not existing instance variable 'mainDelegate'

那么,您没有在HistoryViewController.m 中显示您的位置(应该在viewDidLoad()):

_mainDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

【讨论】:

好的,我使用您向我展示的内容对其进行了编辑,我相信我得到了进一步阻止它的唯一原因是我收到一条错误消息“NSInvalidArgumentException:无法识别的选择器已发送到实例”我相信我正在创建我的字典错误或将字典错误地放入数组中。这可能是为什么? 阅读错误信息的其余部分......“无法识别的选择器发送到实例”之后是什么? 好吧,您还没有显示任何与ticketNo 相关的代码,因此无法帮助您。无论如何,这超出了您最初问题的范围。 哦,对不起,我不是故意把ticketNo放在那里它应该是“长度”我会编辑错误 “由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI 长度]:无法识别的选择器发送到实例 0x281c00f80”libc++abi.dylib:以未捕获的 NSException 类型异常终止”不知道会不会有影响?

以上是关于Obj-C UITable 没有填充 MutableArray的主要内容,如果未能解决你的问题,请参考以下文章

Obj-C - didSelectRowAtIndexPath没有开火?

Obj-C UIDownpicker 将在滚动期间用另一个值填充另一个文本字段

不要删除 UITable 的第一行

Obj-C,根据plist值设置UILabel的颜色?

如何使 UIButton 从 UITable 中的选择中播放相应的音频剪辑?

如何使用 Parse 中的字符串填充 UI 表视图