我是iOS和Objective-C以及整个MVC范例的新手,我坚持以下内容:
我有一个视图作为数据输入表单,我想让用户选择多个产品.产品列在另一个带有a的视图中,UITableViewController我启用了多个选择.
我的问题是,如何将数据从一个视图传输到另一个视图?我将UITableView在数组中保留选择,但是如何将其传递回上一个数据输入表单视图,以便在提交表单时将其与其他数据一起保存到Core Data?
我已经四处浏览并看到一些人在app delegate中声明了一个数组.我读了一些关于单身人士的事情,但不明白这些是什么,我读了一些关于创建数据模型的内容.
执行此操作的正确方法是什么?我将如何进行此操作?
model-view-controller objective-c uiviewcontroller ios swift
weak引用似乎在Swift中不起作用,除非a protocol声明为@objc,我不想在纯粹的Swift应用程序中.
此代码给出了编译错误(weak不能应用于非类类型MyClassDelegate):
class MyClass {
weak var delegate: MyClassDelegate?
}
protocol MyClassDelegate {
}
Run Code Online (Sandbox Code Playgroud)
我需要为协议添加前缀@objc,然后才能工作.
问题:什么是"纯粹的"Swift方式来实现weak delegate?
我试图检查文本字段何时更改,相当于textView使用的函数 - textViewDidChange到目前为止我已经这样做了:
func textFieldDidBeginEditing(textField: UITextField) {
if self.status.text == "" && self.username.text == "" {
self.topRightButton.enabled = false
} else {
self.topRightButton.enabled = true
}
}
Run Code Online (Sandbox Code Playgroud)
哪种工作,但topRightButton只要按下文本字段就启用,我希望只有在实际输入文本时才能启用它?
我有一个理论问题.现在我正在阅读Apple的ViewController指南.
他们写:
当需要关闭呈现的视图控制器时,首选方法是让呈现视图控制器关闭它.换句话说,只要有可能,呈现视图控制器的同一视图控制器也应负责解除它.尽管有几种技术用于通知呈现视图控制器应该解除其呈现的视图控制器,但是优选的技术是委托.
但我无法解释,为什么我必须在呈现的VC中创建一个协议并添加委托变量,在呈现VC中创建委托方法以解除所呈现的VC,而不是在呈现的视图控制器方法中的简单调用
[self dismissViewControllerAnimated:NO completion:nil]?
为什么第一选择更好?为什么Apple推荐它?
我不想要UIButton或类似的东西.我想UIControl直接子类化并制作我自己的非常特殊的控件.
但由于某种原因,我所覆盖的任何方法都没有被调用过.目标动作的东西起作用,目标接收适当的动作消息.但是,在我的UIControl子类中,我必须捕获触摸坐标,这样做的唯一方法似乎是覆盖这些人:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"begin touch track");
return YES;
}
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"continue touch track");
return YES;
}
Run Code Online (Sandbox Code Playgroud)
它们永远不会被调用,即使它UIControl是使用指定的初始化程序实例化的UIView,initWithFrame:.
我可以找到的所有示例总是使用UIButton或UISlider作为子类的基础,但我想更接近,UIControl因为这是我想要的源:快速和未延迟的触摸坐标.
我正在尝试将数据传递回以前的viewController.
有谁知道如何将数据从ViewController B传递回ViewController A?所以我想要一个字符串'从'BIDAddTypeOfDealViewController转到BIDDCCreateViewController.用户编辑了viewController B,我想在ViewController A中返回已编辑的数据然后我使用它.
我正在使用此答案的"传递数据"部分.我的不同之处:第3点和第6点只是在弹出视图时提及,所以我将该代码放在viewWillDisappear中.我认为这是正确的吗?同样在Point 6,我没有使用nib进行初始化,因为它已经过时了.我正在使用故事板.而且我没有添加最后一行,因为我不相信我会推动它.按我的故事板上的按钮已经让我前进了.
我认为问题可能出现在BIDDCCreateViewController中,我有方法,但我无法运行它.要运行一个方法,它应该[自我方法].我无法做到这一点.那就是我猜的.
它编译并运行良好,没有任何记录,所以我不知道它是否有效.
更新:我无法获得'sendDataToA'方法来执行.
#import <UIKit/UIKit.h>
#import "BIDAddTypeOfDealViewController.h"
@interface BIDDCCreateViewController : UIViewController
@property (strong, nonatomic) NSString *placeId;
- (IBAction)gotoBViewController:(id)sender;
@end
#import "BIDDCCreateViewController.h"
#import "BIDAddTypeOfDealViewController.h"
@implementation BIDDCCreateViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId);
}
-(void)sendDataToA:(NSString *)myStringData
{
NSLog(@"Inside sendDataToA");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Your string Data Showing" message:myStringData delegate:self cancelButtonTitle:@"Ok " otherButtonTitles:nil];
[alert show];
}
- (IBAction)gotoBViewController:(id)sender …Run Code Online (Sandbox Code Playgroud) 我的应用程序有一个详细视图控制器的协议,说明他们必须有一个viewModel属性:
protocol DetailViewController: class {
var viewModel: ViewModel? {get set}
}
Run Code Online (Sandbox Code Playgroud)
我还有一些实现协议的不同类:
class FormViewController: UITableViewController, DetailViewController {
// ...
}
class MapViewController: UIViewController, DetailViewController {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的主视图控制器需要一个可以设置为UIViewController实现DetailViewController协议的任何子类的属性.
不幸的是我找不到任何关于如何做到这一点的文档.在Objective-C中,它将是微不足道的:
@property (strong, nonatomic) UIViewController<DetailViewController>;
Run Code Online (Sandbox Code Playgroud)
似乎Swift中没有可用的语法来执行此操作.我最接近的是在我的类定义中声明一个泛型:
class MasterViewController<T where T:UIViewController, T:DetailViewController>: UITableViewController {
var detailViewController: T?
// ...
}
Run Code Online (Sandbox Code Playgroud)
但后来我得到一个错误,说"Class'MasterViewController'没有实现其超类的必需成员"
这似乎在Swift中应该像在Objective-C中一样容易,但是我找不到任何可以表明我如何去做的事情.
我想制作一个仅在我的应用程序中使用的自定义键盘,而不是需要安装的系统键盘.
文档
上面的第一篇文章指出:
确保自定义的系统范围键盘确实是您想要开发的.为了仅为您的应用提供完全自定义的键盘,或仅在您的应用中使用自定义键补充系统键盘,iOS SDK提供了其他更好的选择.在iOS文本编程指南的"数据输入自定义视图"中阅读有关自定义输入视图和输入附件视图的信息.
这就是我上面第二篇文章的原因.但是,那篇文章没有足够的细节让我开始.
教程
我能够从上面列表中的第二个教程中获得一个工作键盘.但是,我找不到任何教程,这些教程展示了如何制作一个仅限应用程序的键盘,如数据输入自定义视图文档中所述.
堆栈溢出
在回答当前问题的路上,我也问了(并回答了)这些问题.
有没有人在应用程序自定义键盘中有一个最小的例子(甚至一个按钮)?我不是在寻找一个完整的教程,只是一个概念证明,我可以扩展自己.
我有一个自定义UITableViewCell子类及其相关的xib.我在这个单元格中有一个UILabel和一个UIButton,我已经将按钮内部的触摸连接到子类.
我需要的是点击单元格中的按钮,以获取具有该按钮的单元格的索引路径.也许可以通过委托或其他东西将其发送回视图控制器.
因为我是里面UITableViewCell的子类,我不能使用的溶液等这个,因为我不从小区子类中,必须在tableview中的参考.经过进一步调查,我找到了另一个解决方案,我在Swift中实现了这个.
import UIKit
class ContactCell: UITableViewCell {
@IBOutlet weak var nameLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
selectionStyle = .None
}
@IBAction func callButtonPressed(sender: UIButton) {
let indexPath = (self.superview as UITableView).indexPathForCell(self)
println("indexPath?.row")
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我点击按钮时,它会崩溃,并显示一条错误消息,指出Swift动态转换失败.
知道我的代码有什么问题吗?
或者我愿意接受任何其他建议,这些建议可以让我以任何其他方式达到预期的结果.
谢谢.
我按如下方式设置了一个观察者,其中包括以下logYes()功能:
class SplashPageVC: UIViewController {
func logYes() {
println("Yes");
}
override func viewDidLoad() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "logYes:", name: "userValid", object: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
我已经将以下IBAction连接到一个按钮:
class LoginVC: UIViewController {
@IBAction func loginSubmitted(sender : AnyObject) {
NSNotificationCenter.defaultCenter().postNotificationName("userValid", object: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
点击按钮时出现以下错误:
[_TtC13Explorer12SplashPageVC self.logYes:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
我尝试了一堆不同的选择器,没有运气:
logYes
logYes:
logYes()
logYes():
Run Code Online (Sandbox Code Playgroud)
我没有想法.任何见解?tyvm :)
参考文献:
在postNotificationName中没有发送
NSNotification :在Swift 中的swift委托中称为NSNotificationCenter addObserver
?
ios ×8
swift ×7
objective-c ×4
iphone ×2
cocoa-touch ×1
delegates ×1
keyboard ×1
nsindexpath ×1
protocols ×1
uibutton ×1
uicontrol ×1
uitableview ×1
uitextfield ×1