2015-04-02 150 views
1

我有“屏幕A”和“屏幕B”,我有“屏幕A”上的按钮,可以导航到“屏幕B”,如何从另一个屏幕快速更改一个屏幕的颜色?

在“屏幕B”上,我有两个按钮“按钮红色”和“按钮绿色”,我想通过按“屏幕B”

按钮来改变“画面A”的颜色我想做到这一点使用委托

即使解决方案在Objective-C也有利于

+0

你最终搞清楚了吗? – 2015-04-02 19:54:15

回答

2

你可以做到这一点通过以下方式:

protocol ViewControllerBDelegate: class { 
    func changeColor(color : UIColor) 
} 

class ViewControllerB: UIViewController { 

    weak var delegate : ViewControllerBDelegate? 

    @IBAction func changeColorInViewController(sender: UIButton) { 
     // send the message to change the color in A regarding the color 
     sender.tag == 0 ? delegate?.changeColor(UIColor.redColor()) : 
         delegate?.changeColor(UIColor.greenColor()) 
    } 
} 

以上ViewController是要更改ViewControllerA的颜色ViewControllerB

然后你就可以实现以下方式ViewControllerA

class ViewControllerA: UIViewController , ViewControllerBDelegate { 

    var viewControllerB : ViewControllerB! 

    // In this method you receive the notification when the button in B is tapped 
    func changeColor(color: UIColor) { 
     self.view.backgroundColor = color 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {   
     var dest = segue.destinationViewController as! ViewControllerB 

     self.viewControllerB = dest // instantiate the reference 
     self.viewControllerB.delegate = self // set the delegate for B 
    } 
} 

两个重要的事情:

  1. 我设置在prepareForSegueViewControllerB参考,因为你有一个按钮,打开ViewControllerB,但在您手动呈现它时,您可以根据需要更改它。
  2. 我只为ViewControllerB中的两个按钮实现了action,并且我为每个按钮分配了一个tag(您可以在Interface Builder或代码中执行此操作)来识别它并发送有关按钮按下的颜色,但可以如果你想分开做。

我希望这对你有所帮助。

+0

你会希望委托财产弱,以避免保留周期。我会建议对此进行编辑。很多人都没有在Swift中出于某种原因这样做,但仍然应该如此。 – 2015-04-02 15:35:45

+0

@ pasta12是的,你是对的,我会编辑我的代码 – 2015-04-02 15:37:17

+0

好的或接受我的编辑。 – 2015-04-02 15:37:33

0

我能想到的最简单的方法

都说屏幕A是FirstViewController,它已加入脚本名称“屏幕A”

var storyboard = UIStoryboard(name: "Main", bundle: nil) 
var controller: UIViewController = storyboard.instantiateViewControllerWithIdentifier("Screen A") as FirstViewController 
controller.view.backroundColor = UIColor.redColor() 
+0

谢谢,bur我想用代表 – sss 2015-04-02 14:11:49

3

我不会拼出来的代码你,因为委托模式是我认为你真的需要出去工作你自己,所以它是有道理的,但我会给你你需要的要求。

  1. 请在屏幕B.协议这将包含您的委托方法
  2. 添加一个委托方法传回的颜色,屏幕A.命名约定将类似于- (void)shouldUpdateToColor:(UIColor *)color
  3. 添加弱,非原子id<YourProtocol>类型的财产调用委托(或任何你想称之为)。
  4. 在屏幕A,宣告画面A会从B屏
  5. 符合YourProtocol实现屏幕的委托方法的
  6. 设置屏幕A作为B屏的代表,当你转换到B屏
  7. 按下按钮时,在屏幕B中调用委托方法。由于屏幕A是代表,它将调用屏幕A中的方法,它将更新您的按钮。

Here's a link about delegation in Swift

+0

加上它听起来像一个家庭作业。为什么任何一个正确思考的人不只是访问视图对象并改变其颜色? – 2015-04-02 14:14:58

+0

谢谢,真的很好的答案我会尝试使用你自己的方式来做到这一点,是的,就像它了解代表 – sss 2015-04-02 14:15:09

+0

我假设它是两个单独的视图控制器,而不仅仅是两个视图。 – 2015-04-02 14:16:13

1

目标C:

@protocol ScreenBDelegate <NSObject> 

- (void)screenBChangedColor:(UIColor *)color; 

@end 

@interface ScreenB : UIViewController 

@property (weak, nonatomic) id<ScreenBDelegate>delegate; 

@end 

@implementation ScreenB 

- (IBAction)buttonRedTapped 
{ 
    if([self.delegate respondsToSelector:@(screenBChangedColor:)]){ 
     [self.delegate screenBChangedColor:[UIColor redColor]]; 
    } 
} 

@end 

@interface ScreenA() < ScreenBDelegate> 

@end 

@implementation ScreenA 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.screenB.delegate = self; //find the best place to do it 
} 

- (void)screenBChangedColor:(UIColor *)color 
{ 
    self.view.backGroudColor = color; 
} 

@end 
+0

谢谢..尼斯帮助 – sss 2015-04-02 14:21:08

+0

所以批准它:) – Klevison 2015-04-02 14:23:54

相关问题