我已经通过展开segues部分观看了故事板实现的苹果演示视频,并在主视图上使用自定义按钮观看了演示.这很好.
我也看到了同样的事情的一个很好的例子也有效.http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues
但是,我希望有一个正常的推送segue从父(带有主窗体数据)传递到子(具有高级设置选项),然后使用导航栏中的后退按钮返回到父视图控制器,而不是使用自定义按钮视图中显示的视图.然后,当按下父控制器上的另一个保存按钮时,父控制器将所有内容保存到API服务器.
我似乎无法覆盖导航后退按钮将其指向我的展开segue动作,因为后退按钮没有出现在故事板上,我无法将绿色的"退出"按钮拖到它上面
我在viewDidLoad中尝试过这个来覆盖动作,但它没有用[self.navigationItem.backBarButtonItem setAction:@selector(unwindSegueAction :)];
是否可以使用后退按钮展开推送segue?
到目前为止我最好的想法是覆盖viewDidLoad方法中的后退按钮,但这会删除成角度的后退按钮样式,对于一个简单的问题看起来似乎是一个粗略的黑客
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(unwindSegue:)];
Run Code Online (Sandbox Code Playgroud)
我知道有使用协议和委托的答案,但我有兴趣使用Xcode4.5展开segue方法
我创建了两个视图控制器.我从第一个到第二个创建了一个segue来传递数据.现在我想将数据从第二个视图控制器传递到第一个视图控制器.我经历了许多类似的问题而我无法实现这些问题,因为我缺乏有关如何解开的知识.
ViewController.swift
class ViewController: UIViewController
{
var dataRecieved: String?
@IBOutlet weak var labelOne: UILabel!
@IBAction func buttonOne(sender: UIButton)
{
performSegueWithIdentifier("viewNext", sender: self)
}
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
var svc: viewControllerB = segue.destinationViewController as! viewControllerB
svc.dataPassed = labelOne.text
}
}
Run Code Online (Sandbox Code Playgroud)
这会将数据传递给视图控制器"viewControllerB"中的dataPassed.说,现在我想将一些数据从viewControllerB传递到ViewController中的dataRecieved.如何只使用unwind segue而不是使用委托来完成此操作.我对迅捷很新,会很感激详细解释.
当用户触摸动态TableView中的单元格时,我需要执行Popover segue.但是,当我尝试使用此代码执行此操作时:
- (void)tableView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"toThePopover" sender:[tableView cellForRowAtIndexPath]];
//...
}
Run Code Online (Sandbox Code Playgroud)
比我得到一个错误:
非法配置
Popover segue没有锚
有没有办法做到这一点(手动从动态TableView执行popover segue)?
在iOS 6中是否可以知道何时UIStoryboardSegue完成了转换?就像当我在navigationcontroler上添加一个UIStoryboardSeguefrom UIButton来推送另一个UIViewController时,我希望在推送转换完成后立即执行某些操作.
我在一个故事板上有太多的观点,导致它运行得很慢.我被告知这个问题的解决方案是将一个故事板分成多个故事板.谁能告诉我如何通过按钮从故事板1的视图到故事板2中的视图?
所以我有一个这样的prepareForSegue方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "fromEventTableToAddEvent" {
let addEventViewController: AddEventViewController = segue.destinationViewController as! AddEventViewController
addEventViewController.newTagArray = newTagArray
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行时,应用程序崩溃并记录此消息:
无法转换'UINavigationController'类型的值
之所以出现错误,是因为addEventController嵌入在导航控制器中,但我不知道如何设置segue以便将destinationViewController设置为NavigationController,还允许我将prepareForSegue方法中的变量传递给addEventController
那我怎么用Swift呢?
我非常感谢您提供的帮助和时间作为回应.它有很多帮助
我认为viewDidLoad会在prepareForSegue结束后被调用.这就是Hegarty如何教他的斯坦福大学课程(最近在2013年2月).
但是,今天我第一次注意到,在READForSegue完成之前调用了viewDidLoad.因此,我在prepareForSegue中设置的属性不可用于目标viewDidLoad方法中的destinationViewController.
这似乎与预期的行为相反.
UPDATE
我只知道发生了什么事.在我的destinationViewController中,我有一个自定义setter,每次更新"model"时都会重新加载tableView:
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
事实证明,因为destinationViewController是UITableViewController的子类...调用'self.tableView'会强制加载视图.根据Apple的文档,调用视图控制器的view属性可以强制加载视图.UITableViewController的视图是tableView.
因此,在prepareForSegue中,以下行强制加载destinationViewController的视图:
vc.managedObjectsArray = <custom method that returns an array>;
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我将destinationViewController模型的自定义setter更改为:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
Run Code Online (Sandbox Code Playgroud)
如果tableView在屏幕上,这将只重新加载tableView.因此,在prepareForSegue期间不强制加载视图.
如果有人反对这个过程,请分享您的想法.否则,我希望这可以防止一个人长时间不眠之夜.
我有3个segues到3个不同的视图.2实现没有问题,是在创建第三个问题时.
我有以下didSelectRowAtIndexPath方法:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@" ---------- did select row");
if(indexPath.section == 0){
if(indexPath.row == [self.data count]-1){
//prior to adding this, everything works
[self performSegueWithIdentifier:@"MoreComments" sender:self];
}else{
[self performSegueWithIdentifier:@"FriendView" sender:friend];
}
}else if(indexPath.section == 1){
if(indexPath.row == [self.data2 count]-1){
[self performSegueWithIdentifier:@"MorePosts" sender:self];
}else{
[self performSegueWithIdentifier:@"FriendView" sender:friend];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下prepareForSeque方法:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"MorePosts"]){
MorePostsViewController *mfamvc = segue.destinationViewController;
mfamvc.data = self.data;
}else if([segue.identifier isEqualToString:@"FriendView"]){
FriendViewController *fvc = segue.destinationViewController;
fvc.friend = friend;
}else if([segue.identifier isEqualToString:@"MoreComments"]){
MoreCommentsViewController *mcvc …Run Code Online (Sandbox Code Playgroud) interface-builder storyboard didselectrowatindexpath ios segue
在Xcode中,Popover segue有两个名为Anchor和Passthrough的连接字段.它们用于什么?

试着做一些我见过很多地方记录的事情,但似乎无法管理.我想在segue期间将数据从一个视图传递到另一个视图.
这是源视图中的prepareForSegue方法:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//pass values
DetailViewController *dest = (DetailViewController *)[segue destinationViewController];
dest.locTitle = [value valueForKeyPath:@"title"];
dest.locInfo = [value valueForKeyPath:@"info"];
// NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);
}
Run Code Online (Sandbox Code Playgroud)
如果我最后启用NSLog,我会看到正确的值...
这是目标视图上的接口:
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController{
}
@property (strong, nonatomic) NSString *locTitle;
@property (strong, nonatomic) NSString *locInfo;
@property (weak, nonatomic) IBOutlet UILabel *detailMainText;
@property (weak, nonatomic) IBOutlet UILabel *detailTitle;
@end
Run Code Online (Sandbox Code Playgroud)
...这里是目标视图上的viewDidLoad和相关的@synthesize:
@synthesize detailMainText,detailTitle,locTitle,locInfo;
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"In viewDidLoad - …Run Code Online (Sandbox Code Playgroud) segue ×10
ios ×9
storyboard ×5
xcode ×3
swift ×2
ios6 ×1
uistoryboard ×1
unwind-segue ×1
viewdidload ×1