可以通过instantiateViewControllerWithIdentifier访问由VC创建的视图控制器方法

时间:2015-06-27 16:02:57

标签: ios

我有一个根UIViewController,它的NSManagedObjectContext var由AppDelegate设置(iOS8 app使用Swift编码)。

根控制器(splitview控制器的主视图)有一个按钮,其动作呈现另一个具有以下代码段的UIViewController:

signed char c = 0xAF; // probably gives an overflow warning
int i = c; // extra 24 bits are all 1
assert( i == 0xFFFFFFAF );

我收到如下编译错误: '的UIViewController'没有名为' managedObjectContext'的成员对于代码行:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("addGeometricEntityContent") as! UIViewController
vc.managedObjectContext = self.managedObjectContext
self.presentViewController(vc, animated: true, completion: nil)

我尝试将一个简单的testPrint()函数添加到呈现的UIView控制器作为测试,并得到类似的抱怨,vc实例确实有一个方法testPrint()

storyboard.instantiateViewControllerWithIdentifier创建的vc实例是否与完全实例化的对象有所不同?

如果我删除该行

vc.managedObjectContext = self.managedObjectContextas a test 

代码按预期工作并呈现UIViewController实例。

2 个答案:

答案 0 :(得分:0)

可以从任何地方访问应用程序委托对象,因此您可以在视图控制器中编写

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedObjectContext = appDelegate.managedObjectContext

答案 1 :(得分:0)

我能够通过将UIViewController类型向下转换为我的特定控制器类型来解决问题,如下所示:

 (defparameter *earth-radius* 6372.8)
 (defparameter *e* (exp 1))
 (defparameter *rad-conv* (/ pi 180))

 (defun km->miles (km)
    (* km .621371))
(defun miles->km (miles)
    (* miles 1.60934))

 (defun mph->mpm (mph)
    (/ mph 60))

(defun kph->kpm (kph)
    (/ kph 60))

(defun deg->rad (deg)
  (* deg *rad-conv*))

(defun haversine (x)
  (expt (sin (/ x 2)) 2))

(defun dist-rad (lat1 lng1 lat2 lng2)
  (let* ((hlat (haversine (- lat2 lat1)))
         (hlng (haversine (- lng2 lng1)))
         (root (sqrt (+ hlat (* (cos lat1) (cos lat2) hlng)))))
    (* 2 *earth-radius* (asin root))))

(defun dist-deg (lat1 lng1 lat2 lng2)
  (dist-rad (deg->rad lat1)
            (deg->rad lng1)
            (deg->rad lat2)
            (deg->rad lng2)))

;acos(sin(lat2)-sin(lat1)*cos(d)) / (sin(d)*cos(lat1))
(defun course-calc (lat1 lng1 lat2 lng2)
  (acos(/(*(- (sin(lat2)) (sin(lat1))) (cos(dist-rad lat1 lng1 lat2 lng2))) (* (sin(dist-rad lat1 lng1 lat2 lng2)) (cos(lat1))))))

(defun course (lat1 lng1 lat2 lng2)
  (if (< (sin (- lng1 lng2)) 0)
      (course-calc lat1 lng1 lat2 lng2) 
      (-(* 2 pi)(course-calc lat1 lng1 lat2 lng2))))