UIView里面有一个UIViewController还是更好的方法呢?

时间:2013-01-08 15:54:30

标签: objective-c ios uiview uiviewcontroller uiview-hierarchy

我对如何正确执行某种操作存在疑问。

下图显示了一个UIViewController,但视图的第二部分是自定义UIView(具有配置文件pic,名称和Show View按钮的那个)。 使用以下代码分配子类UIView:

    profileView = [[GPProfileView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 70)];
    profileView.myTripGradientColor = YES;
    [self.view addSubview:profileView];

问题当然是,UIView上的按钮无法显示任何视图,因为只有UIViewController可以将另一个ViewController推送到窗口(正确吗?)。

UIView在应用程序的多个位置使用,需要轻松添加,并在整个应用程序中具有相同的行为。

这很好用,直到我添加了按钮,我开始认为我犯了这个错误,并且必须有一个更好的方法(可能将UIView更改为其他东西?)。

我以为我应该可以致电:

self.superview

然后以某种方式获取ViewController,这样我就可以将另一个ViewController推送到视图层次结构中,但是没有。

有关如何正确执行此操作的任何建议和提示?

更新: 我不知道如何从按钮推送另一个UIViewController。

按下UIView中的按钮时,我该怎么办?

- (void) showViewButtonTouched:(UIButton*)sender {
GPProfileSocialFriendsViewController *friendsSettings = [[GPProfileSocialFriendsViewController alloc] init];

}

如何推送GPProfileSocialFriendsViewController?

An image of a UIView inside a UIViewController, the UIView has a button on it

3 个答案:

答案 0 :(得分:1)

我认为您可以在UIViewController上的GPProfileView中创建弱引用。像这样:

@property (weak, nonatomic) UIViewController *rootController;

创建GPProfileView时,请指定rootController-property:

profileView = [[GPProfileView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 70)];
profileView.myTripGradientColor = YES;
profileView.rootController = self;   // if view created in view controller
[self.view addSubview:profileView];

并执行按钮选择器:

self.rootController push... // or pop

可能这不正确,但您可以尝试

答案 1 :(得分:1)

您的- (void) showViewButtonTouched:(UIButton*)sender方法应该在您的控制器中,并且可能更好地命名为- (void) showView:(UIButton*)sender- (void) showProfile:(UIButton*)sender,因此它清楚地表明它的作用(而不是您如何到达)。

管理从一个州到另一个州的过渡不是视图的责任。如果您将方法移动到控制器,问题就不再存在(如果您没有这样的导航控制器,您可以轻松访问self.navigationController或直接推送:

[self presentViewController:vcThatNeedsToBePushed animated:YES completion:nil];

答案 2 :(得分:0)

按下按钮时,您可以让视图控制器按下下一个视图控制器。视图控制器可以在按钮上添加目标/操作,以便在内部触摸事件中调用视图控制器中的操作方法。