我正在尝试从 XIB 或情节提要(使用 MvvmCross 5.0.6)加载 ViewModel 绑定的 ViewController。我的应用程序的逻辑是这样的:该视图控制器不属于标准根/子导航模式,我需要能够动态实例化它。
如果没有 MvvmCross,我可以轻松地在 Xamarin.iOS 中使用 Segues,但 MvvmCross 似乎不适用于 Segues(除非我误解了某些内容)。
如何实例化视图控制器,以便将其绑定到其视图模型,并且可以将其传递给 UIViewController.AddChildViewController() 等方法?
我已尝试以下操作,但会导致 NullReferenceException (在 MvxViewModelLoader.LoadViewModel(MvxViewModelRequest request, IMvxBundle savingState) 处):
var vmRequest = new MvxViewModelRequest(typeof(MyVcViewModel));
var myVc = (segue.DestinationViewController as MvxViewController).CreateViewControllerFor<MyVcViewModel>(vmRequest) as MyVc;
this.AddChildViewController(myVc);
Run Code Online (Sandbox Code Playgroud) !注意:我见过一些其他问题报告有关出现黑条的问题,但该问题不是重复的(如果我错了,请纠正我),对我来说,当我执行推送转场时,会出现类似黑色视图的内容。黑条问题的解决方案都不适合我(区别:我出现了黑色视图)。我在故事板中使用了标准的“show”segue。以下是viewDidLoad我的第一个 vc中的代码UIViewController(此 vc 执行到我的第二个 vc 的转接):
if #available(iOS 11.0, *) {
navigationController!.navigationBar.prefersLargeTitles = false
}
mapView.delegate = self
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
Run Code Online (Sandbox Code Playgroud)
这是我的第二个 vc 中的代码viewDidLoad(segue 通向此 vc):
if #available(iOS 11.0, *) {
navigationController!.navigationBar.prefersLargeTitles = true
}
Run Code Online (Sandbox Code Playgroud)
他们都使用相同的navigationController. 对于我的第一个 vc,我想要 navBar preferresLargeTitles = false,对于我的第二个 vc,我想要 navBar,preferresLargeTitles = true这就是我在viewDidLoad方法中所做的事情。MapKit关于和 的5 行CoreLocation不应导致这种效果,但我不知道为什么会出现这个黑色视图,所以我留下了这些代码行。当执行转场时,如何删除出现在导航栏后面的黑色视图?(当segue完成后黑色消失)(右上角的黑色是困扰我的)
uinavigationbar uinavigationcontroller segue uistoryboardsegue swift
Xcode 自动更新,现在我的注册屏幕视图控制器显示在我转换到的当前视图控制器下方。查看屏幕截图我该如何解决这个问题?
如果我创建一个 segue 并使用 Interface Builder 选择当前模式,那么当我运行该应用程序时,我现在将在当前屏幕下方看到上一个屏幕。在更新之前这从来都不是问题。(我在整个应用程序中使用相同的背景,因此我的大多数视图控制器背景都设置为透明。)
另外,我认为这是相关的,当我在 Xcode 中查看故事板并将视图设置为使用 iPhone 8 Plus 时,它显示了一个以前不存在的浅灰色圆角矩形。查看故事板布局 当我运行应用程序时,我的大多数视图控制器现在都被限制为这种形状并且不再全屏。请参阅此处的示例 我的设置视图控制器使用白色背景,因此您可以更轻松地看到我在说什么。这个VC曾经是全屏的,没有向下移动并且在顶部圆角。有任何想法吗?
Xcode 11.1 针对 iOS 12.1
xcode interface-builder viewcontroller presentmodalviewcontroller segue
当我使用segues推送视图(直接通过在故事板上拖动它)时,它工作正常,并加载下一个视图.但是,当我尝试以编程方式实现所有这些以在我点击PIN的右箭头(在地图中)时推送视图时,我有点困惑:
编辑
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
NSLog(@"calloutAccessoryControlTapped: enseigneDeLaStation");
[self performSegueWithIdentifer:@"You identifier" sender:self];
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
Receiver Type 'MyFirstViewController' for instance message does not declare a method with selector performSegueWithIdentifer:sender:
Run Code Online (Sandbox Code Playgroud) 我目前正在使用具有图形功能的计算器应用程序.那么,我在我的计算器中有这个按钮,并将它连接到我的Calculator2ViewController上.此外,我将此按钮连接到另一个名为GraphViewController的UIViewController,并将segue的标识符命名为showGraph.下面是我的segue的代码.
- (GraphViewController *)graphViewController {
return [self.splitViewController.viewControllers lastObject];
}
- (IBAction)graphPressed {
if ([self graphViewController]) {
[[self graphViewController] setProgram:self.brain.program];
}
else {
[self performSegueWithIdentifier:@"showGraph" sender:self];
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
[segue.destinationViewController setProgram:self.brain.program];
}
Run Code Online (Sandbox Code Playgroud)
那里,没有错误和警告.但是当我尝试运行应用程序并按下Graph按钮时,应用程序崩溃并在我的控制台上获取此信息.
2012-06-18 11:08:17.272 Calculator2[1135:f803] -[Calculator2ViewController graphPressed:]: unrecognized selector sent to instance 0x6c38850
2012-06-18 11:08:17.273 Calculator2[1135:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Calculator2ViewController graphPressed:]: unrecognized selector sent to instance 0x6c38850'
Run Code Online (Sandbox Code Playgroud)
请告诉我这是为什么会发生这种情况,我怎样才能以更好的方式做到这一点.谢谢!
编辑:
更改- (IBAction)graphPressed到- (IBAction)graphPressed:(id)sender.segue现在有效.但是,我在我的控制台上有这个通知(这有点可怕) …
我有两个类,machineClass和buttonsClass ...从按钮类,我想要一个按钮以编程方式推入machineClass.
我得到了与之合作:
machineClass *mc = [self.storyboard instantiateViewControllerWithIdentifier:@"machineClass"];
mc.passedString = purchase;
[self presentViewController:mc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
但是,这使用默认的segue动画(视图垂直显示),我认为如果我使用交叉溶解转换,我的应用程序看起来会更好.
有人可以帮忙吗?我提出的最佳解决方案是将其更改为:
[self presentViewController:mc animated:NO completion:nil];
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这个......
谢谢!
我试图从NSObject类的不同类调用performSegueWithIdentifier,我收到此错误:
因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:
'Receiver (<DerinlikView: 0x95b1ac0>) has no segue with identifier 'DerinlikToPali''
Run Code Online (Sandbox Code Playgroud)
我的代码是:
Class1(NSObject):
DerinlikView *derinlik = [DerinlikView alloc];
[derinlik performSegue];
Run Code Online (Sandbox Code Playgroud)
Class2(UIViewController):
- (void) performSegue
{
[self performSegueWithIdentifier:@"DerinlikToPali" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ( [[segue identifier] isEqualToString:@"DerinlikToPali"] )
{
Palinolojik *pali = segue.destinationViewController;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在处理一个带有两个UIViewControllers的应用程序.应用程序启动时,会触发LoaderViewController.在该视图控制器上,我正在设置启动应用程序,然后尝试进入ViewController.问题是prepareForSegue方法被正确调用,但它什么也没做.我正在尝试像以前那样进行导航.我可能在这里缺少什么?我在iOS开发方面还是一个新手.
class LoaderViewController: UIViewController {
@IBOutlet weak var applicationLoadingIndicator: UIActivityIndicatorView!
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewDidLoad() {
super.viewDidLoad()
applicationLoadingIndicator.startAnimating()
self.performSegueWithIdentifier("ToMenuViewController", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
var vc: ViewController = segue.destinationViewController as ViewController
}
}
Run Code Online (Sandbox Code Playgroud)
这是故事板的图像:

编辑 - 解决方案:
解决方法是将performSegueWithIdentifier调用更改为viewDidAppear()方法.
我Present as Popover在Interface Builder中选择了我的StoryBoard Segue.

我怎样才能获得对UIPopoverController的引用prepareForSegue?
我试过这样,但它不在if语句中.
if segue is UIStoryboardPopoverSegue {
let popoverSegue = segue as UIStoryboardPopoverSegue
simpleTableViewController.popoverController = popoverSegue.popoverController
}
Run Code Online (Sandbox Code Playgroud)
如果你需要popovercontroller,只是为了解雇它,那么解雇自适应视图控制器的方法是:
self.dismissViewControllerAnimated(true, completion: nil)
Run Code Online (Sandbox Code Playgroud) 我的前提是我对XCode和Swift完全不熟悉,所以我知道我犯的是愚蠢的错误,但我不知道在哪里.这是我的iOS应用故事板的一部分:
其中第一个表视图和第二个导航控制器之间的segue称为myTaskDetailSegue,其类型为Show(例如Push).现在我有一些问题:
1)既没有在第一个表视图控制器也没有在第二个显示后退按钮,我不知道为什么.许多人告诉我导航栏和后退按钮在导航控制器中是默认的,但它们没有出现
2)在第一个表视图控制器的类中这里是方法prepareForSegue()
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "myTaskDetailSegue" ) {
let indexPath = self.tableView.indexPathForSelectedRow()
let task = self.taskCollection[indexPath!.row] as Task
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailsMyTasksViewController
controller.detailItem = task
println("segue mostra task \(task.id)")
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以读到segue标识符是正确的,但是当点击一行时没有任何反应,并且没有显示第二个表视图控制器.
由于我的经验不足,我真的不知道自己错过了什么......如果你能帮助我并向我解释这些事情,我将非常感激.谢谢大家
segue ×10
ios ×6
swift ×3
xcode ×3
iphone ×2
objective-c ×2
mvvmcross ×1
storyboard ×1
uitableview ×1
xamarin.ios ×1