【问题标题】:Passing data between ObjectClass and ViewController在 ObjectClass 和 ViewController 之间传递数据
【发布时间】:2012-03-13 02:06:14
【问题描述】:

我正在尝试将一些数据从对象类传回我的视图控制器。

这是对类和视图在做什么的基本概述,然后我将向您展示我的代码。

所以 ViewController,加载它的 tableviewcells。然后在这个委托方法里面它调用我创建的一个连接类,在那个连接类里面是 NSURLConnection 方法连接和从数据库下载数据,在这个连接类的 connectionDidFinishLoading 方法中我设置了一个解析类并传递所有下载的数据到此为止。 然后我解析该数据,并在 parserDidEndDocument 内的解析器结束时,我试图将现在位于数组变量中的数据发送回我的视图控制器以进行显示。但是..由于某种原因,我的协议和代表无法正常工作。 我已经在 m 解析器类中设置了协议,并在我的视图控制器中设置了委托,但它从来没有进入我的协议方法。

我将在下面向您展示我的代码。

parserclass.h

@protocol PassParsedData <NSObject>
@required
- (void)sendManufactureArray:(NSArray *)array;
@end
//..
id <PassParsedData> delegate;
//..
@property (strong) id delegate;
//

parserclass.m

#import "VehicleSearchViewController.h"
//..
@synthesize delegate;
//..


- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    //.. array stuff is set up and i can log it so i know its working.. i just want to show you the protocol and delegate stuff to be clear
    [[self delegate]sendManufactureArray:filteredArray];
}

然后转到我的视图控制器,我希望在其中调用协议并取回过滤后的数组数据。

ViewController.h

#import "EngineResponses.h" //delegates & protocols
//..
@interface SearchViewController : UITableViewController <PassParsedData> {
//..

Viewcontroller.h

#import "EngineResponses.h"
//..
- (void)viewDidLoad
{
    [super viewDidLoad];
//..
parserClass *pc = [[parserClass alloc] init];
    [pc setDelegate:self];
//..
}

- (void)sendManufactureArray:(NSArray *)array //Breakpoint here is never accessed
{
    FilterArray = array;
    [self.tableView reloadData]; 
}

正如您在我正在调用的协议的最后一个方法中看到的,它从未被线程访问过。我查过了,这个电话

[[self delegate]sendManufactureArray:filteredArray];

可以正常访问..但它永远不会回到视图控制器..任何想法...我错过了什么吗? ..我完全不知所措,整天都在努力。

任何帮助将不胜感激! :)

更新:

我已将此添加到我的 ViewController.h

//..
ParserClass *parserclass;
//..
@property (strong, nonatomic) ParserClass *parserclass;
//..

viewcontroller.m

@synthesize parserclass;
//..
//then I call this in viewdidload
[engineResponses setDelegate:self];

【问题讨论】:

  • 您是否尝试过将 parserClass 设为通用变量,而不是 viewdidload 的本地变量?
  • 就像 Eric 说的那样,除非我误解了 arc 的概念,否则您的 pc 类仅在 viewdidload 方法中存在,即使您将委托设置为强,pc 实例也与视图控制器有很强的链接但不是相反,只要 viewdid 加载完成,pc 类中的所有属性都为零,并且 arc 事物将处理它。
  • 我添加了 MyClass *myclass;等进入 ViewController 的标题并 @synthesized 它.. 然后我调用了 [myclass setDelegate:self];但它仍然没有进入视图控制器中的 -(void)sendManufactureArray... 方法.... :(
  • 我已经更新了我的问题.. 来检查我是否创建了一个全局值。
  • 这一行[engineResponses setDelegate:self],应该是self.parserclass.delegate = self吧?假设您也在 viewDidload 中实例化了 parseclass 瞬间。

标签: iphone ios delegates protocols


【解决方案1】:

正如其他人在 cmets 中所说,您的 pc 变量在 viewDidLoad 块的末尾被释放,因为它的唯一引用超出了那里的范围。如果你想让它继续存在,你必须扩大它的范围(即使它成为一个实例变量)。

【讨论】:

  • 正确。所以这就是创建 @property (strong, nonatomic) MyClass *myclass; 等然后合成它?
  • 所以我把它变成了一个全局变量..但它仍然没有解决问题..这是一个非常棘手的问题......
  • 您不需要将其设为属性,而是将其添加到 .h 文件中的变量列表中。在@interface 之后的花括号部分中添加该变量并分配给该变量,而不是在 viewDidLoad 方法中声明 pc。
猜你喜欢
  • 2016-03-24
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多