我尝试构建一个rss阅读器。在“添加Feed”页面上,如果点击“添加”按钮,我希望检查是否成功添加了Feed。如果已添加,则触发展开segue,然后返回主页面。如果未添加,请保留当前页面。
我知道我可以在“添加”按钮上建立IBAction,并检查是否添加了Feed。但是,为了添加Feed,我需要满足两个要求。
首先,在我解析url后,我需要知道解析结果是否可以生成一个feed。要解析url,我需要使用mainViewController中定义的方法。
其次,我需要检查Feed是否已存在。如果此Feed已存在,请不要添加它。要检查这一点,我需要从mainViewController获取feed数据。
目前我使用prepareForSegue将数据从主viewController传递到此视图。但对于条件展开segue,我不知道如何传递数据并检查Feed是否已存在。因为只有在触发segue时才使用prepareForSegue。如果没有触发segue,我无法检查条件。
除了通过segue,还有其他方法可以从其他视图传递数据吗?
我不知道Objective-C,所以如果你能在swift中给我一些解决方案会更好。 :)
答案 0 :(得分:1)
与Schemetrical一样,使用委托是访问MainViewController中方法的简单方法。
由于您将此标记为Swift,我还将为您提供Swift中委托的一个小示例。
首先创建一个协议:
protocol NameOfDelegate: class { // ":class" isn't mandatory, but it is when you want to set the delegate property to weak
func someFunction() -> String // this function has to be implemented in your MainViewController so it can access the properties and other methods in there
}
在MainViewController中,你必须添加:
class MainViewController: UIViewController, NameOfDelegate {
// your code
@IBAction func button(sender: UIButton) {
performSegueWithIdentifier("toOtherViewSegue", sender: self)
}
fun someFunction() -> String {
// access the other methods and return it
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "toOtherViewSegue" {
let destination = segue.destinationViewController as! OtherViewController
destination.delegate = self
}
}
}
最后一步,你必须添加代表的属性,这样你就可以"对话"它。我个人认为这个属性是两个视图控制器之间的某种门,所以他们可以互相交谈。
class OtherViewController: UIViewController {
weak var delegate: NameOfDelegate?
@IBAction func button(sender: UIButton) {
if delegate != nil {
let someString = delegate.someFunction()
}
}
}
我假设您使用segue访问其他ViewController,因为您在帖子中提到了它。通过这种方式,您可以随时随地进行#34;到您的MainViewController。
编辑:
至于放松。这也可以通过segue完成。
@IBAction func unwindToConfigMenu(sender: UIStoryboardSegue) { }
添加到您的MainViewController。OtherViewController
顶部有3个图标。单击内部有方形的圆形黄色以确保选中ViewController而不是内部的某些元素。OtherViewController
我似乎无法发布任何代码了吗? :o稍后会添加。
答案 1 :(得分:0)
您始终可以使用代理人。
在添加Feed页面中设置委托,并让mainViewController
符合委托。添加委托方法(- (BOOL)canGenerateFeed:(NSURL *)url
)和委托属性(@property (weak, nonatomic) id <AddFeedControllerDelegate> delegate
)。
当您的添加Feed页面调用[self.delegate canGenerateFeed:url]
并且您的mainViewController
符合该委托时,将调用mainViewController
中的方法(应按方法声明中的说明回复BOOL)。然后您可以相应地回复“是”或“否”,这将被发送回添加供稿页面。
答案 2 :(得分:0)
- (UIViewController*)viewControllerForStoryboardName:(NSString*)storyboardName class:(id)class
{
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
NSString* className = nil;
if ([class isKindOfClass:[NSString class]])
className = [NSString stringWithFormat:@"%@", class];
else
className = [NSString stringWithFormat:@"%s", class_getName([class class])];
UIViewController* viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"%@", className]];
return viewController;
}
// get the view controller
ViewController* viewController = (ViewController*)[self viewControllerForStoryboardName:@"MyStoryboard" class:[OtherViewController class]];
// Pass data here
viewController.data = myData;
// or you can push it
[self.navigationController pushViewController:viewController animated:YES];