2016-06-10 20 views
0

Ich versuche, Daten zwischen meinen beiden View-Controller in meinem UIscrollview übergeben. Ich versuche, Delegation zu verwenden, um Daten zwischen Viewcontroller1 und Viewcontroller2 zu senden. Der Delegierte ist Viewcontroller, während der Delegierer Viewcontroller1 und Viewcontroller2 ist.UIscrollview Delegation

In dem unten angegebenen Code, wenn der Schalter in Viewcontroller1 umgeschaltet wird, macht es den Schalter in Viewcontroller2 in den "Aus" -Zustand versetzt. Ich bekomme immer wieder die

Fehler, wenn ich es ausführen, aber ich habe keine Ahnung, was dieses Problem verursacht. Irgendwelche Ideen warum?

Unten ist die Viewcontroller, die die Uiscrollview und die Subviews/childviews

}

hier ist der Viewcontoller1 Code

protocol testing{ 
func test1() 
} 
    class ViewController1: UIViewController { 

var delegate:testing? 

@IBOutlet weak var switch1: UISwitch! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let vc = ViewController() 
    self.delegate = vc 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func switch1toggled(sender: AnyObject) { 
    delegate?.test1() 

} 

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

} 

und hier ist der Viewcontroller 2 Code

enthält

import UIKit 

class ViewController: UIViewController, testing { 


var vc1 = ViewController1(nibName: "ViewController1", bundle: nil) 
var vc2 = ViewController2(nibName: "ViewController2", bundle: nil) 



@IBOutlet weak var scrollView: UIScrollView! 

func test1() { 
    vc2.switch2.on = false 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 



    self.addChildViewController(vc1) 
    self.scrollView.addSubview(vc1.view) 
    vc1.didMoveToParentViewController(self) 



    var frame1 = vc2.view.frame 
    frame1.origin.x = self.view.frame.size.width 
    vc2.view.frame = frame1 

    self.addChildViewController(vc2) 
    self.scrollView.addSubview(vc2.view) 
    vc2.didMoveToParentViewController(self) 


    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * 2, self.view.frame.size.height); 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
import UIKit 

class ViewController2: UIViewController { 
@IBOutlet weak var switch2: UISwitch! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func switch2toggled(sender: AnyObject) { 
} 

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}

sorry für den langen Post, ich habe seit einer Woche, wie sich ändern, den Zustand eines anderen Schalters von Makeln einen Schalter in einer anderen Klasse stecken, und das war der effizienteste Weg, den ich

gefunden
+0

Sie vc1 Sie setzen seinen Delegaten auf eine neue, leere Instanz von 'ViewController', die nicht mit ihren IBOutlets verbunden ist, so erhalten Sie eine Null-Ausnahme. Sie können den Delegaten einer Klasse nicht selbst festlegen. Der Delegat muss vom Delegierten aus festgelegt werden. in viewcontroller set 'vc1.delegate = vc2' – Paulw11

+0

@ Paulw11 würde es Ihnen etwas ausmachen, genauer zu sein, wenn ich vc1.delegate = vc2 in der Viewcontroller-Klasse setzen, um es zum Laufen zu bringen? –

+0

@ Paulw11 wenn ich versuche, den oben genannten Code in Viewcontroller zu tun, int die Funktion func test1() bekomme ich den Fehler "Kann den Wert nicht zuweisen" Viewcontroller2 ", um" Testing? " –

Antwort

0

Try This:

ViewController1

class ViewController1: UIViewController { 

    let defaults = NSUserDefaults.standardUserDefaults() 

    let switch1Key = "view1Switch" 

    override func viewWillAppear(animated: Bool) { 
    view1Switch.on = defaults.boolForKey(switch1Key) 
    } 

    @IBOutlet weak var view1Switch: UISwitch! 

    @IBAction func view1SwitchChanged(sender: UISwitch) { 
    defaults.setBool(view1Switch.on, forKey: switch1Key) 
    } 

} 

ViewController2

class ViewController2: UIViewController { 

    let defaults = NSUserDefaults.standardUserDefaults() 

    let switch1Key = "view1Switch" 

    override func viewWillAppear(animated: Bool) { 
    view2Switch.on = defaults.boolForKey(switch1Key) 
    } 

    @IBOutlet weak var view2Switch: UISwitch! 

    @IBAction func view2SwitchChanged(sender: UISwitch) { 
    defaults.setBool(view2Switch.on, forKey: switch1Key) 
    } 

} 

Diese Methode synchronisiert den Status der beiden UIS-Schalter mit viewWillAppear und NSUserdefaults. Das grundlegende Denkmuster besteht darin, dass Sie den Status des Schalters auf NSUserdefaults speichern, sodass bei der Instanziierung von ViewController1 oder ViewController2 die Eigenschaft .on des View1Switch- oder view2Switch-Ausgangs auf den gespeicherten Wert gesetzt wird.

Caveats:

  1. Der erste Wert für den Schalter, wenn ViewController1 (in dem ersten App Laufe) instanziiert wird ausgeschaltet sein, weil boolForKey false zurück, wenn kein Wert gespeichert ist. Dies kann gehackt werden mit view1Switch.on = true direkt nach view1Switch.on = defaults.boolForKey(switch1Key)

  2. Diese Methode macht die Schalter den gleichen Wert haben. Um ihnen unterschiedliche Werte zu geben, können Sie a! Operator wie so in ViewController2 view2Switch.on = !defaults.boolForKey(switch1Key). Auf diese Weise Schalter 1 wird immer das Gegenteil von dem Schalter seiner 2.

ich diese Methode über Delegation empfehlen, weil, während Delegation mächtig ist, seine Macht hier scheint nicht nötig. Wenn Sie irgendwelche Fragen haben, fragen Sie bitte!: D