如何从另一个屏幕快速更改一个屏幕的颜色?
我有“屏幕A”和“屏幕B”,我有“屏幕A”上的按钮,可以导航到“屏幕B”,如何从另一个屏幕快速更改一个屏幕的颜色?
在“屏幕B”上,我有两个按钮“按钮红色”和“按钮绿色”,我想通过按“屏幕B”
按钮来改变“画面A”的颜色我想做到这一点使用委托
即使解决方案在Objective-C也有利于
你可以做到这一点通过以下方式:
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
}
}
两个重要的事情:
- 我设置在
prepareForSegue
为ViewControllerB
参考,因为你有一个按钮,打开ViewControllerB
,但在您手动呈现它时,您可以根据需要更改它。 - 我只为
ViewControllerB
中的两个按钮实现了action
,并且我为每个按钮分配了一个tag
(您可以在Interface Builder或代码中执行此操作)来识别它并发送有关按钮按下的颜色,但可以如果你想分开做。
我希望这对你有所帮助。
你会希望委托财产弱,以避免保留周期。我会建议对此进行编辑。很多人都没有在Swift中出于某种原因这样做,但仍然应该如此。 – 2015-04-02 15:35:45
@ pasta12是的,你是对的,我会编辑我的代码 – 2015-04-02 15:37:17
好的或接受我的编辑。 – 2015-04-02 15:37:33
我能想到的最简单的方法
都说屏幕A是FirstViewController,它已加入脚本名称“屏幕A”
var storyboard = UIStoryboard(name: "Main", bundle: nil)
var controller: UIViewController = storyboard.instantiateViewControllerWithIdentifier("Screen A") as FirstViewController
controller.view.backroundColor = UIColor.redColor()
谢谢,bur我想用代表 – sss 2015-04-02 14:11:49
我不会拼出来的代码你,因为委托模式是我认为你真的需要出去工作你自己,所以它是有道理的,但我会给你你需要的要求。
- 请在屏幕B.协议这将包含您的委托方法
- 添加一个委托方法传回的颜色,屏幕A.命名约定将类似于
- (void)shouldUpdateToColor:(UIColor *)color
- 添加弱,非原子
id<YourProtocol>
类型的财产调用委托(或任何你想称之为)。 - 在屏幕A,宣告画面A会从B屏
- 符合YourProtocol实现屏幕的委托方法的
- 设置屏幕A作为B屏的代表,当你转换到B屏
- 按下按钮时,在屏幕B中调用委托方法。由于屏幕A是代表,它将调用屏幕A中的方法,它将更新您的按钮。
加上它听起来像一个家庭作业。为什么任何一个正确思考的人不只是访问视图对象并改变其颜色? – 2015-04-02 14:14:58
谢谢,真的很好的答案我会尝试使用你自己的方式来做到这一点,是的,就像它了解代表 – sss 2015-04-02 14:15:09
我假设它是两个单独的视图控制器,而不仅仅是两个视图。 – 2015-04-02 14:16:13
目标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
你最终搞清楚了吗? – 2015-04-02 19:54:15