从NSMutableArray中的Object访问属性不起作用

时间:2015-05-14 11:14:31

标签: ios objective-c iphone uitableview nsobject

我有班级LearnfestItem.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


@interface LearnfestItem : NSObject

@property (strong, nonatomic) NSString * itemId;
@property (strong, nonatomic) NSString * itemTitle;
@property (strong, nonatomic) NSString * itemDescription;
@property (strong, nonatomic) NSString * itemContent;
@property (strong, nonatomic) NSString * itemType;
@property (strong, nonatomic) UIImage * itemImage;
@property (strong, nonatomic) NSDate * itemRegistered;

-(id)initWithData:(NSDictionary *)data andImage:(UIImage *)image;

@end

&安培; Object.m

#import "LearnfestItem.h"
#import "Defaults.h"

@implementation LearnfestItem

-(id)init
{
    self = [self initWithData:nil andImage:nil];
    return self;
}

-(id)initWithData:(NSDictionary *)data andImage:(UIImage *)image
{
    self = [super init];

    self.itemId = data[ITEM_ID];
    self.itemTitle = data[ITEM_TITLE];
    self.itemDescription = data[ITEM_DESCRIPTION];
    self.itemContent = data[ITEM_CONTENT];
    self.itemType = data[ITEM_TYPE];
    self.itemImage = image;
    self.itemRegistered = data[ITEM_REGISTERED];

    return self;
}

@end

在我的UIViewController我有一个UITableView,在NSMutableArray方法中创建了LearnfestItems cellForRowAtIndexPath

LearnfestItem * createLearnfestItem = [[LearnfestItem alloc] initWithData:learnfestItemDictionary andImage:learnfestItemImage];

    NSLog(@"Insert learnfest item with id: %@ at index %li", createLearnfestItem.itemId, (long)row);

    [self.learnfestItemObjects insertObject:createLearnfestItem atIndex:row];

didSelectRowAtIndexPath我希望收到LearnfestItem NSMutableArray的{​​{1}}致电:

self.selectedLearnfestItem = [self.learnfestItemObjects objectAtIndex:indexPath.row];

然后我想将它发送到另一个视图控制器,以便在prepareForSegue segement中显示我执行此操作的数据:

 LearnfestItemViewController * learnfestVC = [segue destinationViewController];
        NSLog(@"Sending learnfest item with id: %@", self.selectedLearnfestItem.itemId);
        learnfestVC.item = self.selectedLearnfestItem;

当我尝试访问LearnfestItem's中的cellForRowAtIndexPath个媒体资源时。我得到的只是空...在我的其他表格视图委托方法等等。任何人都可以发现我做错了什么?感谢

2 个答案:

答案 0 :(得分:0)

您显示的代码缺少所有错误和有效性检查。使用 NSAssert() item.length / item.count 检查时,您将知道发生了什么。

但是,根据您的代码,我建议两件事:

  1. 所有具有可变版本的对象都应使用&#34; copy&#34;属性。现在你有了强大的&#34;指向通过init方法接收的数据的指针,但是如果你将原来给定的数据变量重置为指向别处(例如,在for循环中重用一个数据变量来初始化多个项目),那么...我不知道你的LearnfestItem项目是什么属性将指向。
  2. 确保您的LearnfestItemViewController *项目也是一个副本。
  3. 我的猜测是所有内容都已正确初始化,但之后数据会消失。

    例如:

    @property (nonatomic, copy) NSString * itemId; // Safe
    @property (nonatomic, strong) NSString * itemId; // Not safe
    

    当您的属性类具有可变变量(例如NSString与NSMutableString与MyMutableString)时,复制更安全。使用strong将创建一个指向原始数据的指针,这可能是一个可变实例,之后可能会被修改。使用strong将始终指向原始数据,即使它已被更改。

    第二部分:

    learnfestVC.item = self.selectedLearnfestItem;
    

    您的LearnfestItemViewController包含一些与LearnfestItem类相关的属性。确保它也是副本。使用segues时,调用对象经常会消失。 确保您的新控制器具有所有所需数据的本地副本(或使用协议代理,但这需要更长时间的讨论)

答案 1 :(得分:0)

添加错误和数据有效性检查将使您的任务变得更加容易。而不是试图弄清楚为什么某些东西不起作用,当你的东西不像你期望的那样时,你会得到通知。

这是您的代码快速而肮脏的“维护”。你应该从中得到的是一些想法,检查什么,在哪里以及如何。在正常情况下这是矫枉过正,但现在你有一个神秘的问题,需要找到它。这可能是艰苦而单调的工作。

@import Foundation;
@import UIKit;

@interface LearnfestItem : NSObject
@property (copy, nonatomic) NSString *itemId;
@property (copy, nonatomic) NSString *itemTitle;
@property (copy, nonatomic) NSString *itemDescription;
@property (copy, nonatomic) NSString *itemContent;
@property (copy, nonatomic) NSString *itemType;
@property (strong, nonatomic) UIImage *itemImage;
@property (strong, nonatomic) NSDate *itemRegistered;
- (instancetype)initWithData:(NSDictionary *)data andImage:(UIImage *)image;    
@end

Object.m:

#import "Defaults.h"
#import "LearnfestItem.h"

@implementation LearnfestItem

- (instancetype)init
{
    self = [self initWithData:nil andImage:nil];
    return self;
}

- (instancetype)initWithData:(NSDictionary *)data andImage:(UIImage *)image
{
    NSAssert(data.length, @"My Assert: missing data");
    NSAssert(image, @"My Assert: missing image");
    if ((self = [super init]))
    {
        // TODO: nil ok, if doesn't exist?
        _itemId = data[ITEM_ID];
        _itemTitle = data[ITEM_TITLE];
        _itemDescription = data[ITEM_DESCRIPTION];
        _itemContent = data[ITEM_CONTENT];
        _itemType = data[ITEM_TYPE];
        _itemImage = image;
        _itemRegistered = data[ITEM_REGISTERED];
    }
    return self;
}

@end

“(原始文本)在我的UIViewController中,我有一个UITableView,它在cellForRowAtIndexPath方法中创建了一个了解LearnfestItems的NSMutableArray:”

NSAssert(learnfestItemDictionary.count, @"My Assert: missing dict");
NSAssert(learnfestItemImage, @"My Assert: missing image");
LearnfestItem *createLearnfestItem = [[LearnfestItem alloc] initWithData:learnfestItemDictionary andImage:learnfestItemImage];

NSLog(@"Insert learnfest item with id: %@ at index %@", createLearnfestItem.itemId, @(row));
NSAssert(createLearnfestItem, @"My Assert: missing item");
NSAssert(self.learnfestItemObjects.count > row, @"My Assert: learnfestItemObjects");
self.learnfestItemObjects[row] = createLearnfestItem;

“(原文)关于didSelectRowAtIndexPath我想从NSMutableArray接收LearnfestItem我这样做是通过调用:”

NSAssert(self.learnfestItemObjects.count > indexPath.row, @"My Assert: learnfestItemObjects");
self.selectedLearnfestItem = self.learnfestItemObjects[indexPath.row];

“(原文)然后我想将它发送到另一个视图控制器,以在prepareForSegue段中显示我这样做的数据:”

LearnfestItemViewController *learnfestVC = (LearnfestItemViewController *)[segue destinationViewController];
NSLog(@"Sending learnfest item with id: %@", self.selectedLearnfestItem.itemId);
learnfestVC.item = self.selectedLearnfestItem;