iPhone:隐藏工具栏

3

我有一个A类,它有一个工具栏(以编程方式创建),并且使用property(nonatomic,retain)将该工具栏添加为A类的子视图。在另一个B类中,我想隐藏A类的工具栏。

如何做到这一点?我正在使用但它不起作用?请给我解决方案。我正在使用Xcode 4.3.1

我在B类中编写了以下代码:

但它不起作用

ClassA *aobj= [[classA alloc] init];

[aobj.toolbar sethidden:yes];

1
使用委托方法将A类的对象a传递给B类,并执行[a.toolbar sethidden:yes]。 - Ab'initio
假设ClassA和ClassB都是视图? - Ashley Mills
@arshad,请解释一下你的解决方案,我无法理解它。如果可能的话,请将其发布为答案。感谢您对我的问题表示关注。 - Dinesh Kaushik
1
@Dinesh Kaushik 在 classA.h 中添加 extern id context;,然后在类的 @implementation (全局变量声明的位置) 中添加 id context;。在 classA 的 ViewDidLoad 中添加 context = self;。然后在 classB 中导入 classA.h 并使用 [context.toolbar sethidden:yes];,这里你将 classA 的对象作为外部变量引用。这不是一个好的实现方式。如果您需要更好的方法,请解释您将在哪里创建 classB。 - Ab'initio
@Arshad:非常感谢您宝贵的评论,有了您的帮助,我解决了这个问题。我在单例类中创建了A类的对象(obj),然后在A类的viewdidload方法中将obj=self。在B类中,我使用了obj.toolbar.hidden=YES;。 - Dinesh Kaushik
5个回答

1
在classA.h中添加extern id context;,然后在classA.m中(@全局变量声明的位置)添加id context;add context = self;在classA的ViewDidLoad方法中。然后在classB中导入classA.h并使用[context.toolbar sethidden:yes];,这里你将classA对象作为外部变量进行了声明。这不是一个好的方法。如果你需要更好的方法,请解释一下你在哪里以及如何创建classB。

1
你的代码问题在于你创建了一个新的ClassA实例,并尝试在这个从未显示过的新实例上设置UIToolBar隐藏。
你需要的是一个指向屏幕上显示的ClassA的对象。
所以尝试像这样做:
- (id)initWithClassA:(ClassA *)classa {
     if ((self = [super init])) {
          [classa.toolbar sethidden:yes]; 
     }
     return self;
}

当你创建一个 ClassB 实例时,使用以下代码:

ClassB classb = [[ClassB alloc] initWithClassA:self];

如果您想在ClassB加载完成后隐藏工具栏,您可以在ClassB.h中创建一个ClassA变量,并将其设置为您自己创建的init方法中提供的参数。
- (id)initWithClassA:(ClassA *)classa {
     if ((self = [super init])) {
          instanceOfClassA = classa; 
     }
     return self;
}

我已经理解了问题,但是我无法使用你的代码。 在哪里粘贴这段代码? 因为类已经有一个-(id)initWithNibName方法。 - Dinesh Kaushik
我认为你在ClassA的某个地方初始化了ClassB,然后你要显示ClassB。现在,你不再使用[[ClassB alloc] initWithNibName:@"..."],而是使用[[ClassB alloc] initWithClassA:self]。你所做的是将self(self是原始的ClassA对象)传递给ClassB,在那里它被存储,并且你可以使用它来隐藏工具栏。类是一种描述符,用于描述对象的外观,对象基于类并具有其特定的内存位置,如果你创建一个新实例,你将获得一个新的内存位置,你明白吗? - Fabio Poloni
非常感谢您宝贵的回答,它真的帮助我解决了我的问题。您的答案清楚地解释了我犯的错误以及应该采取什么措施来解决问题。再次感谢。 - Dinesh Kaushik

1

[[classA alloc] init]; 创建一个新的 ClassA 对象。这个新的 ClassA 对象有它自己的新工具栏。这不是之前创建的工具栏。

要访问 ClassB 中的旧工具栏,您需要将旧的 ClassA 对象传递给 ClassB。(您也可以使用委托方法,在运行时决定调用哪个类)

使用 initWithNibName 参数传递方法:

ClassB.h 中:

UIViewController *parentController;

-(id)initWithNibNameAndParentController:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil:(UIViewController*)controller;

In ClassB.m

-(id)initWithNibNameAndParentController:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil:(UIViewController*)controller {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
parentController = controller;
}
return self;
}

在 ClassA 中,initWithNibName 的写法如下:
objB = [[ClassB alloc] initWithNibNameAndParentController:@"..." bundle:nil :self];

现在你可以根据自己的意愿从ClassB.m中隐藏ClassA工具栏

[((ClassA*)parentController).toolbar sethidden:yes];

非常感谢您宝贵的回答,它真的帮助我解决了我的问题。您的回答清楚地解释了我犯错的地方。再次感谢您! - Dinesh Kaushik

0
尝试设置选项卡栏的框架,例如将框架设置为超出屏幕边界的范围将隐藏控件。希望这能对你有所帮助。

感谢您对我的问题表示关注。 在上面的答案的帮助下,我解决了我的问题。 - Dinesh Kaushik

0

在viewDidLoad中:

self.navigationController.navigationBarHidden = YES;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接