如何在 ios5 的 UIViewController 中显示 UIView?
Posted
技术标签:
【中文标题】如何在 ios5 的 UIViewController 中显示 UIView?【英文标题】:How to show a UIView inside a UIViewController in ios5? 【发布时间】:2013-02-16 11:36:06 【问题描述】:我在XIB
文件中设计了一个UIView
。基本上带有一个导航栏和一个按钮来关闭UIVIew
。我想在整个应用程序的几个UIViewControllers
中显示这个UIView
。
下面是我到目前为止所使用的代码。但是UIView
没有显示出来。
我的ViewControllers
是在storyboard
中设计的,但是我需要一个简单的 UIView,这就是为什么我创建了一个新的 UIView 自定义子类以及一个同名的 xib 文件。文件的所有者也设置为自定义子类。这里还需要什么?
@interface BottomSlidingView : UIView //this is my UIView
@implementation BottomSlidingView
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
[self setUserInteractionEnabled:YES];
NSLog(@"Bottom View Loaded"); //I get this log entry but the view doesn't showup.
return self;
- (BOOL)loadMyNibFile
if (![[NSBundle mainBundle] loadNibNamed:@"BottomSlidingView" owner:self options:nil])
return NO;
return YES;
这就是我在UIViewController
中调用自定义UIView
的方式。
-(void)shareButton:(UIBarButtonItem *)button
NSLog(@"share button clicked");
BottomSlidingView *bsv = [[BottomSlidingView alloc] initWithFrame:CGRectMake(20, 480, 280, 420)];
[bsv loadMyNibFile];
[self.view insertSubview:bsv belowSubview:self.optionsToolBar]; //this toolbar is a subview that I am adding to this view controller.
【问题讨论】:
【参考方案1】:我发现您的方法存在一些问题:
从 nib 文件创建视图实例,而不是使用 initWithFrame:
实例化它。例如(如果自定义视图是 nib 文件中唯一的根级对象):
+ (instancetype)bottomSlidingView
return [[[UINib nibWithNibName:@"BottomSlidingView" bundle:nil] instantiateWithOwner:nil options:nil] lastObject];
在 UIView
子类中实现 awakeFromNib 或 initWithCoder: 而不是 initWithFrame:
(从 nib 加载时不会调用)。
在您的视图控制器中,您可以使用以下内容来创建视图:
- (void)shareButtonPressed:(id)sender
BottomSlidingView *slidingView = [BottomSlidingView bottomSlidingView];
[slidingView setFrame:CGRectMake(20, 480, 280, 420)];
[[self view] insertSubview:slidingView belowSubview:[self optionsToolBar]];
希望对您有所帮助。
【讨论】:
如果我使用上面显示的类方法,即 + (UIView *)bottomSlidingView,您能否详细说明如何从 UIViewController 调用它,因为我对如何在单击按钮时调用它感到困惑行动。 好吧,我确实在我的 UIViewController 中实现了该方法但是现在我收到一个错误,即...... self BottomSlidingView * 0x00000000 aDecoder NSCoder * 0x0993e400 要调用 + (UIView *)bottomSlidingView 你应该使用 [BottomSlidingView bottomSlidingView]; 好吧....我做了一个示例项目只是为了测试这个。然而,同样的错误正在发生。任何人都可以对这个问题有所了解。Xcode 在这一行显示 EXC_bad_access 错误“self = [super initWithCoder:aDecoder];”【参考方案2】:如果你想在另一个视图控制器中重用 UIViewController 的 UIView,你需要使用这个......
YourViewController * child = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];//View controller of view , you want to reuse
[self.view addSubView:child.YourView]; //YourView = Name of view, you want to reuse
[self addChildViewController:child];
[child release];
添加 childViewController 后,所有 IBAction 都将在 child 中工作。
并且在删除这个视图之后你必须从 parentViewController 中删除 YourViewController 否则会有内存问题.......
【讨论】:
告诉我你的困惑。我创建了一个包含 32 个视图控制器的应用程序,而没有使用导航控制器或标签栏控制器或故事板,但只使用了这个概念...... 我有几个在故事板中设计的视图控制器。我使用 .Xib 文件来设计一个只是普通的 UIView。现在为了在故事板中的一个 ViewControllers 中显示这个 UIView 我尝试了上面的方法代码....但是现在视图没有显示出来......我可以通过代码显示 UIView ......但我需要多次使用它......这就是为什么我想使用 . Xib 文件......把它想象成一个自定义操作表视图......结合了故事板和 .xib。 Sushrut,对不起,我没有在故事板上尝试过此代码,但如果您使用的是 XIB,那么它会正常工作。如果你只有一个 VIEW 可以重用,那么使用 Xib 并制作一个 mainWindow.xib。制作 mainWindow.xib 使用 THIS 教程。然后在 mainwindow.xib 中添加该视图并在 appdelegate 中给出出口。当你想使用这个视图时写[appdel.window addSubView:appdel.yourView]
希望这对你有帮助以上是关于如何在 ios5 的 UIViewController 中显示 UIView?的主要内容,如果未能解决你的问题,请参考以下文章