removeFromSuperview不会从另一个类中删除视图调用

时间:2011-01-28 07:01:17

标签: iphone

我从.net网络服务器获取网络服务。

在进程中(获取数据)我正在显示带有活动指示符的子视图。

完成获取数据后,我需要关闭该视图。

我有两个类,一个是myclassviewcontroller,webservices

基本上我正在编写代码来获取Web服务webservices。

的webservices课程中

- (void)connectionDidFinishLoading:(NSURLConnection *)连接我这样调用myclass。

myclassviewcontroller *obj = [[myclassviewcontroller alloc]init];
[obj mymethod];

在myclassviewcontroller上,我为我的方法编写了这段代码。

  • (void)mymethod {

    [loadview removeFromSuperview]; }

执行该方法但不删除视图。

我已经在myclassviewcontroller.h类中声明了它。

我通过在NSlog中保留一些文本来检查这一点

但是,如果我使用计时器在myclassviewcontroller.m中调用此mymethod,则会删除视图。

出了什么问题。

任何人都可以帮助我。

我想可能会理解我的问题是什么。如果没有,请让我发表评论。

提前感谢你。

2 个答案:

答案 0 :(得分:0)

问题可能是当你的“main”类已经分配了“loadview”但myclassviewcontroller中的“不可见”时你实例化你的myclassviewcontroller,所以myclassviewcontroller的新实例并不真正知道谁是“loadview”。 ..

我的意思是:loadview被分配并添加到mainView(在您分配的同一个类中) “myclassviewcontroller” ......) 但是你试着删除它不是在你的mainView中,而是在myclassviewcontroller中......

尝试以这种方式修改你的方法:

  (void)mymethod {
    if (loadview!=nil){
      NSLog(@"I'm here...");
      [loadview removeFromSuperview];
    }
  }

查看在调用方法的时间和位置是否存在“loadview”(在myclassviewcontroller中)

卢卡

答案 1 :(得分:0)

我认为代码的问题在于您访问myclassviewcontroller的方式。在数据加载时它必须已经在屏幕上,因此创建该类的新实例并针对其中一个未初始化的成员(loadview)调用方法不会做任何事情。

myclassviewcontroller *obj = [[myclassviewcontroller alloc]init];
// here object has just been initialized 
//    (it is not the same instance as the one on screen)
[obj mymethod];

如果obj是对屏幕上实际viewcontroller的引用,则可以轻松调用:

[obj.loadview removeFromSuperview];

[obj mymethod]; // if you wanted to add more code in that function

因此,真正的问题是您访问myclassviewcontroller的不同实例而不是实际在屏幕上的实例。您需要一个变量,对myclassviewcontroller的正确实例进行一些引用才能访问loadview ivar。

webservices.h

@interface webservices : NSObject {
...

// This ivar will have to be set when webservices is initialized
myclassviewcontroller * viewController;
}
@property (nonatomic, retain) myclassviewcontroller * viewController;

webservices.m需要@synchronize viewController

然后在connectionDidFinishLoading:中,您只需拨打[viewController.loadview removeFromSuperview];

即可