GVKun编程网logo

添加底线以在SwiftUI / Swift / Objective-C / Xamarin中查看

16

本文将分享添加底线以在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中查看

添加底线以在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类属性

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 member textEntryView

我的桥接头很好看.如果我将Nsstring属性添加到上面的.h文件中,我可以在测试中引用它.此外,当我在测试中命令单击MyViewController时,它会将我带到.h文件而不是该文件的.swift生成版本(这似乎是此问题的症状).

我可能会将Xcode 8推向极限.

解决方法

您需要确保在源文件的顶部导入应用程序以进行测试.例如,如果您的应用程序名为MyApp,请插入测试文件的顶部:
import MyApp

如果我省略了导入,我会得到你所看到的相同行为.此外,只要导入到那里,您就不必为单元测试而烦恼.

ios – 在Swift Framework中添加Objective C框架

ios – 在Swift Framework中添加Objective C框架

我正在用 Swift语言编写iOS的Cocoa框架.我需要在这个框架中添加第三方框架(用Objective-C编写).我已将标头添加到桥接文件中.但是当我构建项目时,我收到以下错误:

“不支持使用带有框架目标的桥接头”

解决方法

您应该使用导入ObjcFrameworkName而不是使用桥接标头.

为了使这个可能,objc框架必须包含.modulemap文件,该文件包含导出的模块名称和该框架的所有公共头文件的伞头.

ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?

ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?

我的项目使用 Swift并针对iOS 8.0及更新版本,但我们使用旧的Objective-C项目中的一些文件,并通过CocoaPods引入一些Objective-C库.我应该在这个项目中使用哪个Realm接口:Objective-C还是Swift?我很困惑因为Realm文档中的公告:

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.

解决方法

它们的关键细节是您是打算仅从Swift,还是Swift和Objective-C访问您的Realm模型类.如果您只从Swift访问它们,您可以愉快地使用Realm Swift,即使您的应用程序中的其他地方使用了使用Objective-C编写的代码.如果要从Swift和Objective-C代码访问Realm模型类,则需要使用Realm Objective-C而不是Realm Swift.

objective-c – 在Swift中使用Obj-C完成块

objective-c – 在Swift中使用Obj-C完成块

在Objective-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完成块吗?

解决方法

鉴于您的闭包没有指定可空性限定符(它们几乎肯定是可选的),可以安全地假设您的Objective-C API未经过可空性审核.因此,Swift会将指针视为隐式解包的选项.此外,现在NSDictionary被映射到[NSObject:AnyObject] Swift字典.

因此,它将是:

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键:

enter image description here

当你到达MYCompletionBlock时,再次按回车键,它会显示正确的签名:

enter image description here

如果这个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完成块等相关知识的信息别忘了在本站进行查找喔。

本文标签: