天道酬勤,学无止境

未设置 prepareForSegue 目标控制器属性(prepareForSegue destination controller property not being set)

问题

这是我的prepareForSegue:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqual:@"cameraToRollsSegue"]){
    ALRollsTableViewController *rollsTableViewController = (ALRollsTableViewController *)[segue destinationViewController];
    Camera *c = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
    NSLog(@"CAMERA FROM INSIDE PREPARE FOR SEQUE: %@", c);
    rollsTableViewController.selectedCamera = c;
}

}

我使用 NSLog 验证相机不为空:

CAMERA FROM INSIDE PREPARE FOR SEQUE: <Camera: 0x8dc1400> (entity: Camera; id: 0x8dafba0 <x-coredata://A415F856-5F21-4F08-9CAB-4B2A023B55C3/Camera/p1> ;

ALRollsTableViewController viewDidLoad:

- (void)viewDidLoad
{
    NSLog (@"ROLLS TABLE VIEW CONTROLLER : viewDidLoad!");
    NSLog(@"(selected camera = %@", self.selectedCamera);
 }

结果是:

ROLLS TABLE VIEW CONTROLLER : viewDidLoad!
(selected camera = (null)

没有设置该属性,我可能做错了什么?


更新

在 matt 的帮助下,我确定我的 prepareForSeque 中的目标视图控制器实例与实际的目标视图控制器不匹配:

rollsTableViewController FROM SEGUE: <ALRollViewController: 0x8d90bf0> 
rollsTableViewController FROM viewDidLoad in rollsTableViewController: <ALRollsTableViewController: 0x8c5ab00> 

我不知道为什么会这样或如何解决它。

回答1

聊天后总结:

嗯,这很复杂! 但基本上你是这样说的:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqual:@"cameraToRollsSegue"]){
    ALRollsTableViewController *rollsTableViewController = (ALRollsTableViewController *)[segue destinationViewController];
    // ...
}

问题是[segue destinationViewController]不是ALRollsTableViewController。 因此,您不是在与您认为正在与之交谈的实例交谈,也不是在与您认为正在与之交谈的类的实例交谈。

令人惊奇的是,您的代码在运行时没有崩溃。 你是这样说的:

rollsTableViewController.selectedCamera = c;

rollsTableViewController实际上并不是 ALRollsTableViewController。 当您错误地转换时,您对编译器撒了谎。 然而,当那条线运行时,你并没有崩溃。 为什么不? 这是因为您有很多类带有@property selectedCamera ! 因此,您正在设置不同类的属性。 但是该类中确实存在具有相同名称的属性,因此您没有崩溃。 因此,您没有发现这是错误的类和错误的实例。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 斯威夫特:带有导航控制器的prepareForSegue(Swift : prepareForSegue with navigation controller)
    问题 I am developing an iOS application in Swift. I want to send data from a view to an other one, using the prepareForSegue function. However, my target view is preceded by a navigation controller, so it doesn't work. How can I do this please ? 回答1 在prepareForSegue访问目标导航控制器,然后访问其顶部: let destinationNavigationController = segue.destination as! UINavigationController let targetController = destinationNavigationController.topViewController 您可以从目标控制器访问其视图并传递数据。 在旧版本(现在已过时)的Swift和UIKit版本中,代码略有不同: let destinationNavigationController = segue.destinationViewController as UINavigationController let
  • 如何传递prepareForSegue:一个对象(How to pass prepareForSegue: an object)
    问题 我在地图rightCalloutAccessory有很多注释(带有rightCalloutAccessory按钮)。 该按钮将执行从此mapview到tableview 。 我想根据单击哪个标注按钮将不同的对象(包含数据)传递给tableview 。 例如:(全部组成) 注解1(Austin)->传递数据obj 1(与Austin相关) 注解2(达拉斯)->传递数据obj 2(与达拉斯相关) 注解3(休斯敦)->传递数据obj 3,依此类推...(你明白了) 我能够检测到单击了哪个标注按钮。 我正在使用prepareForSegue :将数据obj传递到目标ViewController 。 由于无法进行此调用,因此无法为我需要的数据obj加上额外的参数,因此有什么优雅的方法可以实现相同的效果(动态数据obj)? 任何提示将不胜感激。 回答1 只需在prepareForSegue:方法中获取对目标视图控制器的引用,然后将所需的任何对象传递到该对象即可。 这是一个例子 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Make sure your segue name in storyboard is the same as this line if ([[segue
  • (快速)PrepareForSegue:致命错误:展开一个可选值时意外发现nil((Swift) PrepareForSegue: fatal error: unexpectedly found nil while unwrapping an Optional value)
    问题 DetailViewController: @IBOutlet var selectedBundesland: UILabel! TableViewController: override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "BackToCalculator") { var vc:FirstViewController = segue.destinationViewController as FirstViewController vc.selectedBundesland.text = "Test" } IBOutlet已连接! 错误:致命错误:解开可选值时意外发现nil 我读了许多有关Optionals的页面,但我不知道解决问题的答案。 您需要有关我的项目的更多信息吗? 回答1 您不能在prepareForSegue直接写入UILabel ,因为视图控制器尚未完全初始化。 您需要创建另一个字符串属性来保存该值,并将其放入相应函数(例如viewWillAppear的标签中。 回答2 DetailViewController: var textValue: String = "" @IBOutlet weak var
  • 以编程方式设置跟随标识符(Set segue identifier programmatically)
    问题 假设我有一个带有 textField 和按钮的 ViewController。 我想使用 unwind segue,以便在单击按钮后将 textField 的信息发送到我的其他 viewController。 我想使用 PrepareForSegue 方法,这样我就可以在“展开”之前将 textField 中的文本保存在一个属性中。 如何手动为我的 segue 设置标识符? 如果它是一个条形按钮项目,我可以使用 IB 设置标识符(例如“保存”),然后使用它。 事实并非如此,只是一个普通按钮。 回答1 无法以编程方式创建 segue。 没有故事板,它们就无法存在。 看到这个问题。 回答2 您可以轻松地以编程方式添加转场(不使用故事板)。 在源视图控制器头文件中: @property (nonatomic, strong) UIStoryboardSegue *segue; 在源视图控制器实现文件中,相应地设置 segue 属性: self.segue = [UIStoryboardSegue segueWithIdentifier:[NSString stringWithFormat:@"%lu", indexPath.item] source:self destination:[PlayerViewController sharedPlayerViewController]
  • 以编程方式创建追随者(Creating a segue programmatically)
    问题 我有一个通用的UIViewController ,我所有的UIViewsControllers扩展以重用一些通用的操作。 我想在此“通用” UIViewController上设置一个序列,以便所有其他UIViewControllers继承。 我正在尝试找出如何以编程方式进行操作。 我想这个问题还可能是我如何为所有UIViewControllers设置一个segue ,而不必进入故事板并手动进行操作。 回答1 根据定义,segue不能真正独立于故事板而存在。 甚至在类名中也有: UIStoryboardSegue 。 您无需以编程方式创建segues-情节提要运行时将为您创建它们。 通常,您可以在视图控制器的代码中调用performSegueWithIdentifier:但这取决于在情节提要中已经设置了segue来进行引用。 我想您在问的是,如何在公共视图控制器(基类)中创建一个方法,该方法将过渡到新的视图控制器,并被所有派生类继承。 您可以通过在基类视图控制器上创建一个像这样的方法来做到这一点: - (IBAction)pushMyNewViewController { MyNewViewController *myNewVC = [[MyNewViewController alloc] init]; // do any setup you need for myNewVC
  • 将ivars放入init(putting ivars into init)
    问题 我有两个视图控制器: BSViewController ,它包含源ivars number和array ,以及BSotherViewController ,它作为目标需要接收ivars。 这个问题提供了一种产生期望结果的方法。 建议是在覆盖指定的init的init中计算self.number和self.array的值,如下所示。 - (id)init { if (self = [super init]) { //Set values NSArray* _array = [NSArray arrayWithObjects: @"manny",@"moe",nil]; self.array = _array; self.number = 25; } return self; } 但是我不知道这种解决方案如何在原始方法( viewDidLoad )中实现self.number或self.array的计算; 我只能用任何尝试的方法在viewDidLoad获得两个值的0和null。 此外,以下行产生警告问题,即view是未使用的变量。 BSViewController *view = [[BSViewController alloc] init]; 因此,我正在寻找一种方法,该方法首先计算我的ivars number和array ,然后执行init(WithNumber
  • 将图像传递到另一个View Controller(Swift)(Passing Image to another View Controller (Swift))
    问题 我正在尝试将用户上传的图像从一个UIImageView移到另一个View Controller上的另一个UIImageView 。 我能够让用户上传图像并将其保存在第一个UIImageView中,但是在他们按下“发布”按钮后,下一个视图控制器上的UIImageView仍然为空白。 注意:browserImage是第二个视图控制器(目标UIImageView)上的UIImageView的名称。 任何帮助将不胜感激! @IBAction func cameraButton(sender: AnyObject) { addNewPicture() } func addNewPicture() { let picker = UIImagePickerController() picker.allowsEditing = true picker.delegate = self presentViewController(picker, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
  • 使用Segue在View Controller之间传递数据(Passing data between View Controllers using Segue)
    问题 我是iOS新手。 我在ViewControllers之间传递数据时遇到问题。 我有三个viewControllers(view_1,view_2和view_3)。 这是我的设置:- 选择view_1 推动view_2 推view_3 我想将'view_1'的ViewController参考(id)发送到'view_3'。 所以我在include "view_3"中include "view_3" ,并将值设置为“ view_3”变量(使用view_3 *v3=[[view_3 alloc] init ]; v3.reference=self; )。 在控制台中,它显示: 视图控制器:-; <ViewController:0x89e9540> 在“ view_1”中,但在“ view_3”中,在控制台中显示 视图控制器(空) 但是,当我使用“ view_2”传递此数据时,它的工作原理。 但是如何? 我想知道这种行为,并且有解决方案吗? 请帮忙。 回答1 当触发segue时,“将数据传递到目标控制器”将通过重写prepareForSegue:sender:方法来实现。 通常,您将数据而不是源视图控制器传递给目标视图控制器。 “数据”可能是您的应用程序“模型”的某个方面。 这是一个类似“用户”的对象,或者是一个包含“用户”的数组,等等。 目标视图控制器不应对源视图控制器有任何了解。
  • 如何在Swift中的视图控制器之间传递数据?(How do you pass data between view controllers in Swift?)
    问题 我尝试创建全局变量并在加载视图但未呈现数据时更新信息。 全球变量 var viewName:String = "" var viewDuration:String = "" var viewPeriod:String = "" var viewMinAmp:String = "" var viewMaxAmp:String = "" var viewStep:String = "" var viewType:String = "" 除了具有全局变量之外,还有没有一种更有效的信息传递方式? @IBOutlet var txtName: UITextField! @IBOutlet var txtDuration: UITextField! @IBOutlet var txtPeriod: UITextField! @IBOutlet var txtMinAmp: UITextField! @IBOutlet var txtMaxAmp: UITextField! @IBOutlet var txtStep: UITextField! @IBOutlet var txtType: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after
  • 转场还是didSelectRowAtIndexPath?(To Segue or to didSelectRowAtIndexPath?)
    问题 下面是我目前正在运行的代码。 我有一个带有导航控制器和 tableview 控制器以及一个视图控制器的故事板设置。 我试图将名称从我为表设置的 NSDictionary 传递到详细信息视图控制器。 我应该使用 prepareforsegue 还是 didselectrowatindexpath 以及如何从字典中获取名称以传递它? #import "FMInboxViewController.h" #import "FMDetailViewController.h" @interface FMInboxViewController () @end @implementation FMInboxViewController @synthesize keyArray; @synthesize tableArray; @synthesize tblDictionary; @synthesize filteredArray; - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *ary=[[NSMutableArray alloc]init]; [ary addObject:@"Adam"]; [ary addObject:@"Fred"]; [ary addObject:@"Angel"]; // ... many
  • 在目标视图控制器中获取segue的发送者(get sender of segue in destination view controller)
    问题 我有一个名为Dashboard(D)的VC,它可以打开一个名为Login(L)的VC和一个名为Register(R)的VC。 登录也可以打开VC Register。 我尝试尽可能多地使用情节提要,因此我创建了三个Segues,即D到L,D到R,L到R 因此,在D-> L-> R的情况下,在D-> R的情况下,当我关闭R时,如果需要,我必须关闭L并通知D他可以开始加载用户信息(在简而言之)。 因此,我想在目标vc中获取Segue的发件人,因为我知道将其放置在performSegueWithIdentifier的发件人实体中,如下所示: [self performSegueWithIdentifier:@"SegueToFbRegister" sender:self]; 回答1 我可以通过在注册/登录完成后让R发送一个通知,然后让D监听然后弹出所有内容并加载您的数据来做到这一点。 但是,如果您坚持要获得对发件人的引用,则可以在目标VC上添加此属性,然后在源VC的prepareForSegue:sender: 回答2 这听起来像是使用代表的好地方。 在您的RegisterViewController.h中定义一个这样的协议 @protocol RegisterViewDelegate <NSObject> - (void)tellRegisterDelegateSomething
  • 是prepareForSegue在视图控制器之间传递值的正确方法(Is prepareForSegue right way of passing value between view controllers)
    问题 我正在尝试学习Swift,并且正在尝试开发著名的note应用程序。 有一个数组绑定到一个tableview,另一个视图用于添加注释。 在第二个视图中,textfieldshouldreturn事件将触发segue并返回到tableview。 我想知道这是否是正确的方法。 因为通过这种方式,我正在另一个视图控制器中操作变量。 我不是MVC专家,但我觉得这是错误的。 这是我的代码段: func textFieldShouldReturn(textField: UITextField) -> Bool { self.performSegueWithIdentifier("backSegue", sender: self) return true } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if(segue.identifier == "backSegue"){ let navController = segue.destinationViewController as UINavigationController; let myController = navController.topViewController as
  • prepareForSegue 和 popViewController 兼容性(prepareForSegue and popViewController compatibility)
    问题 问题 我正在开发一个iOS应用程序,并且我有 3 个连续的ViewControllers : TableViewController --> DetailViewController --> ImageViewController 我用一个按钮执行 de forward Segue(只需控制Storyboard拖动)然后返回我有一个自定义的后退按钮 [self.navigationController popViewControllerAnimated:YES]; 要转发数据,我使用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController someFunction]; } 要将数据发送到父ViewController我可以在DetailViewController使用prepareForSegue ,但它在ImageViewController不起作用,我必须使用Notifications 。 如果我使用prepareForSegue发送带有popViewControllerAnimated数据可以吗? 在这两种情况下我都应该使用通知吗? 一些代码 我在DetailViewController有一个按钮,它对
  • 当我单击按钮而不使用performSegueWithIdentifier时,未调用prepareForSegue(prepareForSegue is not getting called when I click on a button without using performSegueWithIdentifier)
    问题 基于Stanford iOS课程,我正在玩模态视图控制器。 在演示中,他们有一个将启动模式视图的按钮,当单击该按钮时,将调用prepareForSegue函数。 我在我的项目中模仿了代码和实现,唯一的区别是我的演示在iPhone故事板上,而他们的演示在iPad上。 我注意到,当我的模态视图控制器启动时,它不会在此之前调用prepareForSegue。 我搜索了斯坦福大学的项目,以了解他们在调用prepareForSegue之前可以在哪里注册任何segue行为,但是没有证据。 谁能对此有所启发。 我搜索了堆栈溢出,发现所有用户丢失了performSegueWithIdentifier的调用实现。 但是,在斯坦福演示中,他们从来没有这样做。 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier hasPrefix:@"Create Label"]) { AskerViewController *asker = (AskerViewController *)segue.destinationViewController; asker.question = @"What do you want your label to say?"; asker
  • 从UITableViewCell进行3D触摸窥视和弹出如何将数据移交给其他UIViewController?(3D Touch Peek and Pop from UITableViewCell how to hand over data to other UIViewController?)
    问题 我的应用程序在Core Data对象中存储了不同的属性。 它们全部显示在UITableView中,如果单击单元格,则会显示DetailView。 像Master-Detail-XCode-Template中一样的常用东西。 现在,我想用peek和pop实现3D Touch。 像在“邮件”应用程序中一样,3D触摸一个单元格,获取预览,按得更深,然后弹出细节。 到目前为止,我已经完成了这项工作,但是我无法弄清楚如何在其中传递相应的数据 - (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location 和 - (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit 到另一个DetailViewController。 如果您只单击单元格(没有3D触摸),我将数据移交给 - (void)prepareForSegue
  • 在显示新视图之前,iOS segue冻结了几秒钟(iOS segue freeze for many seconds before showing new view)
    问题 在我的应用程序的主视图中,我有一个表格视图和两个原型单元。 我已经使用情节提要为每个单元配置了序列。 在视图控制器中,我重写prepareForSegue,以将所选单元格上的信息传递到目标视图。 目标视图并不是特别复杂,当然不需要任何繁重的处理即可加载。 问题 当我第一次点击主控制器中的某个单元时,目标视图会在5到40秒的长时间延迟后出现。 编辑#2 :后续水龙头通常更快 注意: 如果在出现目标视图之前再次点击同一单元格,则会触发目标视图立即显示。 如上所述,但是轻按不同的单元格会导致视图立即出现,但带有来自第一个单元格的数据。 如上,但是轻按其他控件(没有关联的命令)将触发目标视图立即显示。 后续的“抽头”通常显示较少的延迟。 我所看到的时间剖析器显示,在这么多的延迟中,绝对没有任何反应。 我尝试了不同类型的segues,但没有区别一些println显示,发生了以下事件序列: 在主视图中,执行prepareForSegue(无延迟) 然后执行目标viewDidLoad(无延迟) ...很长的延迟... 目标控制器中的集合视图和表视图将开始调用与数据源相关的方法,以从控制器中获取数据。 该视图最终出现(带有不需要的动画,顺便说一句,但这是另一个问题) 从本主题的阅读中,我怀疑问题可能与在后台线程中发生的上述某些操作有关。 知道我可能做错了什么吗? 编辑#1 :添加了一些代码
  • 在嵌入式segue中未调用prepareForSegue(prepareForSegue not called in embedded segue)
    问题 我在视图控制器的容器中嵌入了一个表视图控制器。 在视图和表视图控制器的prepareForSegue方法中,我都放置了NSLog(@“控制器的名称”),我看到的是视图控制器的日志,而不是表视图控制器的日志。 我还应该在表格视图的prepareForSegue中看到nslog吗? 回答1 在您的日志框架视图控制器中,将在initWithCoder:之后直接调用prepareForSegue来准备您的TableViewController。 我看不到表格视图控制器与另一个视图(右侧视图)之间的连接,但是我相信当您点击该行时,它将被调用。 //扩展 另一件事可能是您没有在视图层次结构上添加UINavigationController,而是将segue样式设置为“ push”。 尝试在属性检查器中将segue的样式更改为“模态”。 希望对您有所帮助。 回答2 确实-正如Greg解释的那样,segue的嵌入类型是 仅在安装过程中调用! 这非常令人困惑。 你可以那样说 “ prepareForSegue”是一个非常糟糕的名字! 名称“准备接缝”仅在(稀有!)情况下才有意义,在这种情况下,您实际上是从一个场景“接生”到另一个场景 在iOS应用程序容器中,视图是司空见惯的,随处可见,而您很少使用实际的“场景选择”。 因此,实际上,“ prepareForSegue”应称为: “嘿
  • Segue模态,导航栏消失(Modal segue, navigation bar disappears)
    问题 我正在使用Xcode 4.6.1在Objective-C上进行编码。 我想知道当我在两个View控制器之间创建模式segue时如何保持导航栏显示,因为我正在情节提要中进行segue,并且当我运行应用程序时,第二个view controller的导航栏消失了,并且我在该栏上有一个完成按钮,但看不到它。 回答1 模态搜索占据了整个屏幕,因此呈现控制器中的所有导航栏,工具栏或选项卡栏都将被掩盖。 如果要在此模式控制器上使用导航栏,则需要专门为其添加一个导航栏,然后将想要的任何按钮添加到该新的导航栏(或工具栏)。 如果您不想执行此操作,则不要以模态显示它,请对其进行推送。 回答2 只需将另一个Navigation Controller添加到模态视图控制器即可。 按照步骤 选择Modal View Controller 转到Editor menu 选择Embed In 选择Navigation Controller 运行应用程序。 现在应该可以正常工作了。 希望这能解决您的问题。 回答3 您可以简单地执行以下操作以显示导航栏: 物镜 UINavigationController alloc]initWithRootViewController:modalVC]; SWIFT 3 let modelVC = self.storyboard
  • 在Swift中将segue从UITableViewCell推送到ViewController(Push segue from UITableViewCell to ViewController in Swift)
    问题 我的UITableViewCells遇到问题。 我将UITableView连接到API以填充单元格。 然后,我创建了一个函数,该函数将抓取indexPath.row来标识应将数组中的哪个JSON对象发送给RestaurantViewController 。 链接到我的Xcode项目,以便更轻松地调试和解决问题 这是我的小片段如何将“行点击”设置为全局变量的样子。 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { i = indexPath.row } 这是我的prepareForSegue()函数,应该将我的推送搜索连接到RestaurantViewController 。 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if segue.identifier == "toRestaurant"{ let navigationController = segue.destinationViewController as UINavigationController let vc = navigationController
  • 引用容器视图的视图(Getting reference to the view of a container view)
    问题 我是iOS App开发的新手。 我已经连接了一个tableview控制器,这样当我选择一行时,我使用didSelectRowAtIndexPath获得了另一个UIViewController。 我在这个UIViewController内部有一个容器视图,该容器视图显示(暂时说)在其上调用didSelectRowAtIndexPath的行的索引。 我想使用segue做到这一点,但是问题是我不知道如何获得对使用容器视图形成的视图控制器的引用。 我知道您可以在prepareForSegue中使用segue.destinationViewController获得目标视图控制器,但是由于容器视图,如何获取将要加载的视图控制器的引用。 我正在构建适用于iOS 6的应用程序。此外,我还在UI中使用了Storyboard。 谢谢 编辑: 这个问题基本上归结为如何获得对UIViewController-1所指向的UIContainerView所指向的UIViewController-2的引用。 通过选择一行UITableViewController来触发UIViewController-1 UITableViewController(选择要给出的行)---> UIViewController-1,其中包含.... ContainerView ---> UIViewController-2