我有一个非常复杂的情况(对我而言)我试图解决但到目前为止我遇到了麻烦。
我现在将概述应用程序的结构,然后解释我遇到的问题。 我正在使用的名称是由于我正在使用的数据的敏感性而构成的。
secondToLastViewController // is a UITableView on the navigation stack
lastViewController // is just a normal UIView that i want to push onto the navigation stack
RequestClass // this class dose requests to my database and passed the data back to correct classes
getInfoClass // class is used for this specific request stores the information correctly and passes it back to secondToLastViewController
因此,当用户在 secondToLastViewController 中启动 didSelectRowAtIndexPath 时,我使用 RequestClass
请求数据- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//..
[RequestClass Getinfo:storedInfoPram];
}
现在线程射向我的 RequestClass ,然后查询数据库中的一些数据,然后将这些数据传递给我的 getInfoClass 原因我这样做是因为在 RequestClass 中有几十个不同的调用都在做不同的事情,这个特殊的请求带回了很多我必须排序成正确的对象类型的数据所以创建了这个类到为我这样做。
内部 getInfoClass 我将所有内容排序为正确的类型等,并将此数据返回传递给名为recivedData的方法中的 secondToLastViewController ,这是我认为事情出错的地方......因为我创建了 secondToLastViewController 的新实例,我不知道如何将数据传回相同的 secondToLastViewController 已经在堆栈中,并且是原始请求来自的地方。
- (void) recivedData {
// do some stuff then pass data back to secondToLastViewController
SecondToLastViewController *sec = [[SecondToLastViewController alloc] init];
[sec sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5];
}
现在回到 SecondToLastViewController 线程落在这个方法
- (void)sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5{
// call detailed view onto the stack
lastViewController *last = [[lastViewController alloc] initWithNibName:@"lastViewController" bundle:nil];
[self.navigationController pushViewController:last animated:YES];
}
线程到达此点后没有任何反应...所有数据都在那里并准备发送但新视图从未被推送到控制器堆栈...我认为这是由于我声明了另一个版本的< strong> secondToLastViewController 当我在里面 getInfoClass
我首先想知道的是如何将sendGetSeriesArrays中的recived数据传递给最终视图,其次如何将lastview加载到导航堆栈中?
答案 0 :(得分:1)
您的观察是正确的,您正在getInfoClass中再次创建secondToLastViewController实例。不要这样做,你必须使用委托/协议方法将数据传递回secondToLastViewController。
这样做 在getInfo类中定义协议
getInfoClass.h
@protocol GetInfoClassProtocol <NSObject>
//delegate method calling after getting data
// I dont know the argument types give it properly
- (void)sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5;
@end
// declare the delegate property
@property (assign, nonatomic)id<GetInfoClassProtocol>delegate;
getInfoClass.m
- (void) recivedData {
// do some stuff then pass data back to secondToLastViewController
if ([self.delegate respondsToSelector:@selector(sendGetSeriesArrays: param2:)])
{
[self.delegate sendGetSeriesArrays:pram1 Pram2:pram2 Pram3:pram3 Pram4:pram4 Pram5:pram5];
}
}
<强> secondToLastViewController.m 强>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//..
RequestClass.delegate = self;
[RequestClass Getinfo:storedInfoPram];
}
您的secondToLastViewController应符合GetInfoClassProtocol
答案 1 :(得分:0)
有很多方法可以实现这一目标。在revivedData
函数中,您可以:
1)在getInfoClass
中保持指向导航控制器的指针,然后您可以从导航堆栈上的视图控制器获取最后一个视图控制器并使用它。这将是视图控制器的活动实例。有办法从窗口对象中恢复它,但那些看起来很脆弱,我不建议采用这种方法。
2)你可以将指向自secondToLastViewController
的指针传递给你的RequestClass getInfo
电话,然后坚持并将其传回。这可能是一种痛苦,取决于您已经拥有的代码量。
3)如果您永远不会有多个secondToLastViewController
,则可以维护该类的静态实例。见How do I declare class-level properties in Objective-C?