本文将分享添加底线以在SwiftUI/Swift/Objective-C/Xamarin中查看的详细内容,此外,我们还将为大家带来关于ios–Swift测试无法在Objective-CVC上找到Swi
本文将分享添加底线以在SwiftUI / Swift / Objective-C / Xamarin中查看的详细内容,此外,我们还将为大家带来关于ios – Swift测试无法在Objective-C VC上找到Swift类属性、ios – 在Swift Framework中添加Objective C框架、ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?、objective-c – 在Swift中使用Obj-C完成块的相关知识,希望对你有所帮助。
本文目录一览:- 添加底线以在SwiftUI / Swift / Objective-C / Xamarin中查看
- ios – Swift测试无法在Objective-C VC上找到Swift类属性
- ios – 在Swift Framework中添加Objective C框架
- ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?
- objective-c – 在Swift中使用Obj-C完成块
添加底线以在SwiftUI / Swift / Objective-C / Xamarin中查看
我只想将边框保留在底部UITextField
。但是我不知道如何才能将其保留在最底层。
你能告诉我吗?
答案1
小编典典我正在创建自定义textField
以使其成为SwiftUI的可重用组件
SwiftUI
struct CustomTextField: View { var placeHolder: String @Binding var value: String var lineColor: Color var width: CGFloat var body: some View { VStack { TextField(self.placeHolder, text: $value) .padding() .font(.title) Rectangle().frame(height: self.width) .padding(.horizontal, 20).foregroundColor(self.lineColor) } }}
用法:
@Binding var userName: String@Binding var password: Stringvar body: some View { VStack(alignment: .center) { CustomTextField(placeHolder: "Username", value: $userName, lineColor: .white, width: 2) CustomTextField(placeHolder: "Password", value: $password, lineColor: .white, width: 2) }}
斯威夫特5.0
我在这里使用视觉格式语言(VFL),这将允许在any中添加一行UIControl
。
您可以创建一个UIView
扩展类,例如UIView+Extention.swift
import UIKitenum LINE_POSITION { case LINE_POSITION_TOP case LINE_POSITION_BOTTOM}extension UIView { func addLine(position : LINE_POSITION, color: UIColor, width: Double) { let lineView = UIView() lineView.backgroundColor = color lineView.translatesAutoresizingMaskIntoConstraints = false // This is important! self.addSubview(lineView) let metrics = ["width" : NSNumber(value: width)] let views = ["lineView" : lineView] self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views)) switch position { case .LINE_POSITION_TOP: self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views)) break case .LINE_POSITION_BOTTOM: self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views)) break } }}
用法:
textField.addLine(position: .LINE_POSITION_BOTTOM, color: .darkGray, width: 0.5)
目标C:
您可以将此帮助程序方法添加到全局帮助程序类(我使用了全局类方法)或同一视图控制器中(使用实例方法)。
typedef enum : NSUInteger { LINE_POSITION_TOP, LINE_POSITION_BOTTOM} LINE_POSITION;- (void) addLine:(UIView *)view atPosition:(LINE_POSITION)position withColor:(UIColor *)color lineWitdh:(CGFloat)width { // Add line UIView *lineView = [[UIView alloc] init]; [lineView setBackgroundColor:color]; [lineView setTranslatesAutoresizingMaskIntoConstraints:NO]; [view addSubview:lineView]; NSDictionary *metrics = @{@"width" : [NSNumber numberWithFloat:width]}; NSDictionary *views = @{@"lineView" : lineView}; [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[lineView]|" options: 0 metrics:metrics views:views]]; switch (position) { case LINE_POSITION_TOP: [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[lineView(width)]" options: 0 metrics:metrics views:views]]; break; case LINE_POSITION_BOTTOM: [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lineView(width)]|" options: 0 metrics:metrics views:views]]; break; default: break; }}
用法:
[self addLine:self.textField atPosition:LINE_POSITION_TOP withColor:[UIColor darkGrayColor] lineWitdh:0.5];
Xamarin代码:
var border = new CALayer(); nfloat width = 2; border.BorderColor = UIColor.Black.CGColor; border.Frame = new CoreGraphics.CGRect(0, textField.Frame.Size.Height - width, textField.Frame.Size.Width, textField.Frame.Size.Height); border.BorderWidth = width; textField.Layer.AddSublayer(border); textField.Layer.MasksToBounds = true;
ios – Swift测试无法在Objective-C VC上找到Swift类属性
我正在Swift中实现一个Snapshot测试,在Objective-C VC上调用一个属性,但是该属性是一个用Swift编写的类,桥接.
在MyViewController.h中:
@class TextEntryView; @interface MyViewController: AbstractTextEntryViewController @property (nonatomic,strong) TextEntryView *textEntryView; @end
在TextEntryView.swift中:
@objc(TextEntryView)类TextEntryView:UIView
在我的测试中,我正试图打电话
vc.textEntryView其中vc是MyViewController类型,我收到错误:
value of type
MyViewController
has no membertextEntryView
我的桥接头很好看.如果我将Nsstring属性添加到上面的.h文件中,我可以在测试中引用它.此外,当我在测试中命令单击MyViewController时,它会将我带到.h文件而不是该文件的.swift生成版本(这似乎是此问题的症状).
我可能会将Xcode 8推向极限.
解决方法
import MyApp
如果我省略了导入,我会得到你所看到的相同行为.此外,只要导入到那里,您就不必为单元测试而烦恼.
ios – 在Swift Framework中添加Objective C框架
“不支持使用带有框架目标的桥接头”
解决方法
为了使这个可能,objc框架必须包含.modulemap文件,该文件包含导出的模块名称和该框架的所有公共头文件的伞头.
ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?
If you’re looking to use Realm from Objective-C,or from mixed Objective-C & Swift apps please see Realm Objective-C instead.
Using both Realm Objective-C and Realm Swift simultaneously is not supported.
解决方法
objective-c – 在Swift中使用Obj-C完成块
File.h
typedef void (^MYCompletionBlock)(BOOL success,NSDictionary *result,NSError *error);
然后,在Swift文件中,我尝试使用完成块,如下所示:
Swift.swift
class MyClass: NSObject{ ... func MyFunction() -> Void { ... objcmethod(param1,withCompletion: {(MYCompletionBlock) -> Void in if (success){ // Error:"Use of unresolved identifier 'success'" } } ... } ... }
但是,我一直收到一个错误:“使用未解析的标识符’成功’”.
我也尝试了以下内容:
objcmethod(param1,withCompletion: {(success:Bool,result: NSDictionary,error:NSError) -> Void in if (success){ // Error:"Cannot convert value of type '(Bool,NSDictionary,NSError) -> Void' to expected argument type "MYCompletionBlock!" } }
有人可以帮我理解如何在Swift中正确指定Obj-C完成块吗?
解决方法
因此,它将是:
obj.objcmethod(param) { (success: Bool,result: [NSObject : AnyObject]!,error: NSError!) in if success { // do something } }
或者,正如Kobi所指出的,您可以让编译器推断出类型:
obj.objcmethod(param) { success,result,error in if success { // do something } }
请注意,您不必自己记住这一点.输入代码时,您可以利用Xcode的代码完成.因此,键入足以匹配方法名称以及何时匹配objcmethod,然后按Enter键:
当你到达MYCompletionBlock时,再次按回车键,它会显示正确的签名:
如果这个Objective-C方法是我自己的类,我会审核它的可空性.因此,例如,让我们假设param是可选的,闭包是必需的,结果和错误是可选的,你可以这样定义它:
NS_ASSUME_NONNULL_BEGIN typedef void (^MYCompletionBlock)(BOOL success,NSDictionary * _Nullable result,NSError * _Nullable error); @interface MyObject : NSObject - (void)objcmethod:(NSDictionary * _Nullable)param1 withCompletionHandler:(MYCompletionBlock)completionHandler; @end NS_ASSUME_NONNULL_END
而且,如果是这种情况,您的Swift代码会像这样调用它:
obj.objcmethod(param) { (success: Bool,result: [NSObject : AnyObject]?,error: NSError?) in if success { // do something } }
或者,再次,让编译器为您推断类型(但这次它们被推断为未隐式解包的选项):
obj.objcmethod(param) { success,error in if success { // do something } }
关于添加底线以在SwiftUI / Swift / Objective-C / Xamarin中查看的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ios – Swift测试无法在Objective-C VC上找到Swift类属性、ios – 在Swift Framework中添加Objective C框架、ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?、objective-c – 在Swift中使用Obj-C完成块等相关知识的信息别忘了在本站进行查找喔。
本文标签: