我有“屏幕A”和“屏幕B”,我在“屏幕A”上有一个按钮,使用它可以导航到“屏幕B”,
在“屏幕B”上我有两个按钮“按钮红色”和“按钮绿色”,我想通过按“屏幕B”上的按钮来改变“屏幕A”的颜色
我想使用委托
来做这件事甚至Objective-C中的解决方案也很有帮助
答案 0 :(得分:3)
我不打算为你拼出代码,因为委托模式是我认为你真的需要自己解决的问题所以它是有道理的,但我会给你你需要的要求。
- (void)shouldUpdateToColor:(UIColor *)color
id<YourProtocol>
类型的弱的非原子属性(或者你想称之为的任何属性)。答案 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())
}
}
以上ViewController
是ViewControllerB
,您希望在其中更改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
}
}
两件重要的事情:
ViewControllerB
中的prepareForSegue
设置了引用,因为您有一个按钮可以打开ViewControllerB
,但是在您手动呈现它时,您可以根据需要进行更改。 action
中的两个按钮实现了ViewControllerB
,并为每个按钮分配了tag
(您可以在Interface Builder或代码中执行此操作)来识别它并发送有关按下按钮的颜色,但如果需要,可以单独进行。我希望这对你有所帮助。
答案 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()