更改按钮单击时的 viewController

Posted

技术标签:

【中文标题】更改按钮单击时的 viewController【英文标题】:Changing viewController on Button Click 【发布时间】:2011-04-28 06:51:39 【问题描述】:

我是 iPhone 编程的新手。我正在尝试的是我有一个带按钮的屏幕。而且我想更改视图控制器,不仅是单击该按钮时的视图(我知道如何添加子视图),因为从第二个视图控制器,我必须转到第三个视图,如果我首先添加子视图,这是不可能的地方。有人可以帮我吗?这可能吗?如果是,如何?所有视图和视图控制器都是以编程方式创建的。我没有使用 IB。

编辑:这是点击按钮时触发的相关代码

-(id)showCurrentLoc:(id)sender  
 locationController = [currentLocController alloc]; 
 [entry removeFromSuperview]; 
 [newLoc removeFromSuperview]; 
 [currentLoc removeFromSuperview]; 
 [self.view setBackgroundColor:[UIColor clearColor]]; //[self.view addSubview: [locationController view]]; 
 [self.navigationController pushViewController:locationController animated:YES];  [locationController release]; 
 return 0; 
 //Location Controller is the tableViewController

谢谢 维克

【问题讨论】:

您可以为此使用导航控制器。 【参考方案1】:

你可以这样做

        YourViewController *objYourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];
        [self.navigationController pushViewController:objYourViewController animated:YES];
        [YourViewController release];

【讨论】:

这就是我正在尝试的,但问题是我试图将 tableViewController 作为我的第二个 viewController 但这不起作用。如果我只是添加 [self.view addSubView:[xyztableview view]]。然后我可以看到我的表格视图。我不知道第一种方法有什么问题? @Vik 你如何定义 tableViewController 即声明?您能否发布为您的 tableViewController 创建对象的代码? @Jennie- 谢谢我能够在委托中声明后使用导航控制器更改视图控制器。【参考方案2】:

通常,您使用导航控制器来处理此类事情,以便用户可以轻松地返回到上一个视图。然后,您的视图控制器将执行以下操作:

[self.navigationController pushViewController:someNewViewController animated:YES];

如果您想自己管理视图控制器,您可以随时更改窗口的rootViewController 属性。完整图片请阅读View Controller Programming Guide。

【讨论】:

@Caleb- 这就是我正在尝试的,但问题是我试图将 tableViewController 作为我的第二个 viewController 但这不起作用。如果我只是添加 [self.view addSubView:[xyztableview view]]。然后我可以看到我的表格视图。我不知道第一种方法有什么问题? @Vik 抱歉——我无法理解您的评论。由于您是 OP,我建议您编辑您的问题以更清楚地解释实际问题。但是,在您这样做之前,请仔细查看我引用的文档。它是 ios 开发者的必读书籍,它明确地解释了如何从一个控制器转移到另一个控制器。 -(id)showCurrentLoc:(id)sender locationController = [currentLocController alloc]; [条目 removeFromSuperview]; [newLoc removeFromSuperview]; [currentLoc removeFromSuperview]; [self.view setBackgroundColor:[UIColor clearColor]]; //[self.view addSubview:[locationController view]]; [self.navigationController pushViewController:locationController 动画:YES]; [位置控制器发布];返回0; //Location Controller是tableViewController 对于初学者,您正在分配但不是初始化 locationController。接下来,如果您使用的是导航控制器,则不需要所有 addSubview/removeFromSuperview 的东西;只需将新的视图控制器推送到导航堆栈上。 @Caleb 请告诉我我要推送的视图控制器是否是 uitabbarcontroller?我也对从一个 VC 切换到另一个感到困惑。 99% 的人表示使用 uinavigationcontroller 它会自动处理 VC 之间的切换。我想自定义管理 VC 之间的切换。【参考方案3】:

UINavigationController 是您所需要的。它管理UIViewControllers 的堆栈,如果您想添加新的 UIViewController,只需将其推送到此导航堆栈中。它为您自动执行后退按钮行为,并且您可以在完成后从堆栈中弹出当前的 UIViewController。

【讨论】:

@Krishnabhadra- 这就是我正在尝试的,但问题是我正在尝试将 tableViewController 作为我的第二个 viewController 但这不起作用。如果我只是添加 [self.view addSubView:[xyztableview view]]。然后我可以看到我的表格视图。我不知道第一种方法有什么问题? 它应该可以工作..你能发布相关代码以便我们交叉检查 这里是点击按钮时触发的相关代码 -(id)showCurrentLoc:(id)sender locationController = [currentLocController alloc]; [条目 removeFromSuperview]; [newLoc removeFromSuperview]; [currentLoc removeFromSuperview]; [self.view setBackgroundColor:[UIColor clearColor]]; //[self.view addSubview:[locationController view]]; [self.navigationController pushViewController:locationController 动画:YES]; [位置控制器发布];返回0; //Location Controller是tableViewController @Vik..不要将代码放在评论中。您可以编辑原始问题并将代码放在那里.. @Barry 删除了教程的链接。无论如何,因为我回答了原始问题,所以不需要它,后来在用户使用 UINavigationController 时对其进行了编辑。【参考方案4】:

您可以使用 UINavigationController。像这样在 init 方法中添加你的第一个 UIViewController:

        [self setViewControllers:[NSArray arrayWithObject:viewController]];

然后当单击按钮或做出选择时,您会使用(在第一个 viewController 中)推动第二个控制器:

[self.navigationController pushViewController:controller animated:YES]; 

这样您还将获得一个自动(后退按钮)。基本上,您创建了一个 UIViewController 堆栈,您可以像使用普通堆栈一样推送和弹出它们。

我希望这会有所帮助。查看以下内容: UINavigationController Class Reference

【讨论】:

【参考方案5】:
- (void) loadViewAtIndex:(NSInteger)index 

    [self unloadViewAtIndex:activeViewIndex];

    switch (index) 

        case 1:
        
            if (viewController1 == nil)
            
                viewController1 = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
            

            viewController1.view.frame = CGRectMake(0.0, 0.0, viewController1.view.frame.size.width, viewController1.view.frame.size.height);

            [window addSubview:viewController1.view];
        
            break;

        case 2:
        
            if (viewController2 == nil)
            
                viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
            

            viewController2.view.frame = CGRectMake(0.0, 0.0, viewController2.view.frame.size.width, viewController2.view.frame.size.height);

            [window addSubview:viewController2.view];
        
            break;

        default:
            break;
    

    activeViewIndex = index;


- (void) unloadViewAtIndex:(NSInteger)index 
    switch (index) 

        case 1:
        
            if (viewController1 != nil)
            
                [viewController1.view removeFromSuperview];
                [viewController1 release];
                viewController1 = nil;
            
        
            break;

        case 2:
        
            if (viewController2 != nil)
            
                [viewController2.view removeFromSuperview];
                [viewController2 release];
                viewController2 = nil;
            
        
            break;

        default:
            break;
    

【讨论】:

以上是关于更改按钮单击时的 viewController的主要内容,如果未能解决你的问题,请参考以下文章

通过打字稿更改按钮单击时的svg颜色

如何使用 Jquery 更改按钮单击时的 django 外键对象文本选择字段?

更改按钮上的标签文本单击列表视图项内

UI-TAB SET == 按钮单击时的活动选项卡

更改高度约束时的iOS自动布局问题

单击按钮时的音频播放问题