如何在swift中从另一个屏幕更改一个屏幕的颜色?

时间:2015-04-02 13:55:10

标签: ios swift

我有“屏幕A”和“屏幕B”,我在“屏幕A”上有一个按钮,使用它可以导航到“屏幕B”,

在“屏幕B”上我有两个按钮“按钮红色”和“按钮绿色”,我想通过按“屏幕B”上的按钮来改变“屏幕A”的颜色

我想使用委托

来做这件事

甚至Objective-C中的解决方案也很有帮助

4 个答案:

答案 0 :(得分:3)

我不打算为你拼出代码,因为委托模式是我认为你真的需要自己解决的问题所以它是有道理的,但我会给你你需要的要求。

  1. 在屏幕B中制作协议。这将包含您的委托方法
  2. 添加委托方法,将颜色传回屏幕A.命名约定类似于- (void)shouldUpdateToColor:(UIColor *)color
  3. 添加一个名为delegate的id<YourProtocol>类型的弱的非原子属性(或者你想称之为的任何属性)。
  4. 在屏幕A中,声明屏幕A将符合屏幕B中的YourProtocol
  5. 在屏幕A中实施委托方法
  6. 转换到屏幕B
  7. 时,将屏幕A设置为屏幕B的代表
  8. 按下按钮时,在屏幕B中调用委托方法。由于屏幕A是委托,它将调用屏幕A中的方法,该方法将更新您的按钮。
  9. Here's a link about delegation in Swift

答案 1 :(得分: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())
   }
}

以上ViewControllerViewControllerB,您希望在其中更改ViewControllerA的颜色。

然后您可以通过以下方式实施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. 我为ViewControllerB中的prepareForSegue设置了引用,因为您有一个按钮可以打开ViewControllerB,但是在您手动呈现它时,您可以根据需要进行更改。
  2. 我只为action中的两个按钮实现了ViewControllerB,并为每个按钮分配了tag(您可以在Interface Builder或代码中执行此操作)来识别它并发送有关按下按钮的颜色,但如果需要,可以单独进行。
  3. 我希望这对你有所帮助。

答案 2 :(得分: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

答案 3 :(得分: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()