【问题标题】:removeFromSuperview is not removing view calling from another classremoveFromSuperview 没有从另一个类中删除视图调用
【发布时间】:2011-01-28 07:01:16
【问题描述】:

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

在处理过程中(获取数据),我正在显示一个带有活动指示器的子视图。

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

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

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

在 web 服务类中

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

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

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

  • (void)mymethod {

    [加载视图 removeFromSuperview]; }

方法被执行,但视图没有被移除。

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

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

但是如果我在 myclassviewcontroller.m 中使用计时器调用这个 mymethod,那么它会删除视图。

怎么了。

谁能帮帮我。

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

提前谢谢你。

【问题讨论】:

  • 这个 loadview 对象是什么?它在哪里初始化?
  • 这是一个带有activityindicator的子视图,我在myclassviewcontroller.h中声明并给它@property(nonatomic,retain)

标签: iphone


【解决方案1】:

我相信您的代码的问题在于您如何访问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 是对屏幕上实际视图控制器的引用,您可以轻松调用:

[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];

【讨论】:

    【解决方案2】:

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

    我的意思是:加载视图被分配并添加到主视图(在您分配的同一类中 “我的类视图控制器”...) 但是然后您尝试不在您的 mainView 中删除它,而是在 myclassviewcontroller 中删除它...

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

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

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

    卢卡

    【讨论】:

    • 我在控制台收到这个信号 程序接收到的信号:“EXC_BAD_ACCESS”.view 没有被删除
    • 好的,要明确一点:你有一个 mainView (UIViewController),你:-alloc loadview(并将它的视图添加到 mainView.view)。 -alloc myclassviewcontroller(并将其视图添加到 mainView.view)。所以现在你的 mainView“拥有”和“记住”谁是“loadview”,但 myclassviewcontroller 没有,如果你不告诉它。 -loadview 在 mainView 中可见,但在 myclassviewcontroller 中不可见。 - 所以你不能在“myclassviewcontroller”中有一个调用“loadview”的方法(或者更好,如果你必须以某种方式传递它,但一定要在你从视图中删除它后从内存中释放它)卢卡跨度>
    猜你喜欢
    • 2021-02-06
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多