我有一个UIViewController,它具有:
@property UIImagePickerController* mainPicker;
Run Code Online (Sandbox Code Playgroud)
并使用一个按钮,我正在呈现mainPicker,如:
- (IBAction)takePhoto:(UIButton *)sender
{
// Take a photo.
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
// No camera is available, show an alert.
UIAlertView* newAlert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:@"Camera is not available."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[newAlert show];
return;
}
if(mainPicker == nil)
{
mainPicker = [[UIImagePickerController alloc]init];
mainPicker.delegate = self;
mainPicker.allowsEditing = YES; //I've tried without this line, didn't affect at all.
mainPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
[self presentViewController:mainPicker animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是;
Snapshotting a view that has not …Run Code Online (Sandbox Code Playgroud) 适当参考:
我们已经开始为 UserDefaults 使用属性包装器,它可以与非可选属性无缝协作。
但是,将可选属性设置为 nil 会崩溃:
[用户默认值] 尝试将非属性列表对象设置为键“someKeyThatWeSet”的 NSUserDefaults/CFPreferences 值
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试为键“someKeyThatWeSet”插入非属性列表对象 null
下面的代码可以直接在 Playground 上测试:
@propertyWrapper
struct C2AppProperty<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
struct C2User {
@C2AppProperty("userID", defaultValue: nil)
public static var publicUserID: String?
}
print(C2User.publicUserID)
C2User.publicUserID = "edusta"
print(C2User.publicUserID)
C2User.publicUserID …Run Code Online (Sandbox Code Playgroud) 我们已经为我们的s实现了一个协议,Reusable以简化UITableView注册/出队实现UITableViewCell。
protocol Reusable: class {
static var defaultIdentifier: String { get }
}
extension Reusable where Self: UITableViewCell {
static var defaultIdentifier: String {
return String(describing: self)
}
}
class TestTableViewCell: UITableViewCell, Reusable { }
class AnotherTestTableViewCell: UITableViewCell, Reusable { }
Run Code Online (Sandbox Code Playgroud)
然后,有一个扩展UITableView喜欢:
extension UITableView {
func register<T: UITableViewCell & Reusable>(_: T.Type) {
register(UINib(nibName: T.defaultIdentifier, bundle: nil), forCellReuseIdentifier: T.defaultIdentifier)
}
}
Run Code Online (Sandbox Code Playgroud)
以及它的用法:
let tableView: UITableView = UITableView()
tableView.register(TestTableViewCell.self)
tableView.register(AnotherTableViewCell.self)
Run Code Online (Sandbox Code Playgroud)
一切正常,但我们想将这些类型移动到数组中,以便进行排序。这就是我们卡住的地方,这不起作用:
let viewCells = …Run Code Online (Sandbox Code Playgroud)