小编Mis*_*cha的帖子

WKWebView无法使用loadHTMLString(_,baseURL :)加载图像和CSS

Apple的推荐:

在iOS 8及更高版本中运行的应用程序中,使用WKWebView类而不是使用UIWebView.

因此,我UIWebView用一个闪亮的新东西取代了我的好老WKWebView.但我认为这是一个简单的练习(简单地交换类和替换委托方法)结果是一个真正的混乱.

问题

当我使用加载HTML字符串时

loadHTMLString(String, baseURL: URL?)
Run Code Online (Sandbox Code Playgroud)

Web视图加载并呈现纯HTML,但它不会加载在其中引用的任何图像或CSS文件htmlString.

这只发生在真实的设备上!
在Simultor中,所有引用的资源都已正确加载.

模拟器 真实设备

htmlString在我的视图控制器类中定义了一个简单的:

let imageName = "image.png"

let libraryURL: URL // The default Library URL

var htmlString: String {
    return "<html> ... <img src=\"\(imageName)\" /> ... </html>"
    // "..." represents more valid HTML code incl. header and body tags
}
Run Code Online (Sandbox Code Playgroud)

图像存储在根库文件夹中,因此其URL为:

let imageURL = libraryURL.appendingPathComponent(imageName)
Run Code Online (Sandbox Code Playgroud)

现在我加载htmlString到Web视图中:

webView.loadHTMLString(htmlString, baseURL: libraryURL)
Run Code Online (Sandbox Code Playgroud)

即使baseURL设置正确,它也不会加载图像.

解决方案的想法

  1. 可能WKWebView …

css image ios swift wkwebview

33
推荐指数
3
解决办法
2万
查看次数

将子视图控制器的视图添加到父视图控制器的子视图

我想添加一个tableViewController作为containerViewController的子视图控制器(如下所示).根据Apple的View Controller Programming Guide,我可以通过我的containerViewController中的以下代码行实现这一点:

   [self addChildViewController:tableViewController];
   [self.view addSubview:tableViewController.view];
   [tableViewController didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)

事实上,这很好.现在的问题是我不想将tableViewController的视图添加为containerViewController的根视图的子视图.相反,我想将它添加为containerView的子视图(参见图像),它本身是containerViewController的根视图的子视图.所以我改变了上面的代码如下:

   [self addChildViewController:tableViewController];
   [self.contentView addSubview:tableViewController.view];
   [tableViewController didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)

现在,当我启动应用程序时,它立即崩溃并出现此错误:

由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'子视图控制器:应该有父视图控制器:但实际的父级是:'

这里有什么问题?是不是可以将childViewController的视图添加到其containerViewController 的特定视图中?或者如何在视图控制器层次结构中没有错误的情况下实现此目的?

containerViewController

parentviewcontroller addsubview ios childviewcontroller container-view

29
推荐指数
1
解决办法
6万
查看次数

为什么在 SwiftUI 中的 TextField 绑定上调用 didSet 两次?

我有一个非常基本的视图,仅显示TextField

看法

struct ContentView: View {

    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        TextField("Enter a string...", text: $viewModel.string)
    }
    
}
Run Code Online (Sandbox Code Playgroud)

TextField文本绑定到string视图模型上的属性:

视图模型

class ViewModel: ObservableObject {
    
    @Published var string: String = "" {
        didSet {
            print("didSet string:", string)
        }
    }
    
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个didSet属性观察器,以便在字符串更改时执行自定义操作。对于这个简单的例子,我只在控制台上打印一个字符串。

观察

当我运行此代码并在文本字段中输入字符串“123”时,这是我得到的输出:

didSet string: 1
didSet string: 1
didSet string: 12
didSet string: 12
didSet string: 123
didSet string: 123
Run Code Online (Sandbox Code Playgroud)

问题:

为什么?
为什么didSet我输入的每个字符都会调用两次闭包?(我希望每个角色都会调用一次。)

代码有什么问题或者这是预期的行为吗?

binding textfield property-observer swiftui observableobject

25
推荐指数
2
解决办法
1561
查看次数

SwiftUI中的约束是什么?

现在受约束的情况SwiftUI如何?难道View类型自动适应更大的设备等,或者我们应该要做的呢?

constraints ios nslayoutconstraint swift swiftui

18
推荐指数
2
解决办法
3041
查看次数

重新加载表视图的数据而不清除其选择状态

我有一个带可选行的表视图.当我重新加载表视图时,可能会添加(或删除)一些新行,并且表视图的单元格中的某些标签可能会更改.这就是我想通过调用实现的目标[tableView reloadData].

不幸的是,该方法还清除了表视图的整个状态 - 包括选择.但我需要保持选择.

那么如何在保持所选行选定的同时重新加载表视图中的所有数据呢?

clear uitableview reloaddata ios

17
推荐指数
2
解决办法
1万
查看次数

如何停止和反转UIView动画?

我已经为UIView设置了动画,以便当用户触摸切换按钮时它会缩小,当用户再次触摸按钮时,它会扩展回原始大小.到目前为止一切正常.问题是动画需要一些时间 - 例如3秒.在此期间,我仍然希望用户能够与界面进行交互.因此,当用户在动画仍在进行时再次触摸按钮时,动画应该停在正确的位置并反转.

在Apple Q&As中,我找到了一种立即暂停所有动画的方法:

https://developer.apple.com/library/ios/#qa/qa2009/qa1673.html

但我没有看到从这里反转动画的方法(并省略了其余的初始动画).我该如何做到这一点?

- (IBAction)toggleMeter:(id)sender {
    if (self.myView.hidden) {        
        self.myView.hidden = NO;
        [UIView animateWithDuration:3 animations:^{
            self.myView.transform = expandMatrix;
        } completion:nil];
    } else {
        [UIView animateWithDuration:3 animations:^{
            self.myView.transform = shrinkMatrix;
        } completion:^(BOOL finished) {
            self.myView.hidden = YES;
        }];
    }
}
Run Code Online (Sandbox Code Playgroud)

animation uiview uiviewanimation ios

15
推荐指数
1
解决办法
1万
查看次数

更改 Swift Package 中的默认标头注释许可证

我想更改 Swift 包中的默认标头。这可能吗?

注意: 我不想为项目更改它。这个有可能。如果您想为您的项目更改它:更改 Xcode 中的默认标题注释许可证

xcode ios swift swift-package-manager

14
推荐指数
1
解决办法
1871
查看次数

在Swift中计算两个日期之间的时差

我已经看到了许多方法来根据特定的日期组件来计算两个日期之间的差异,例如,以天,小时,月等为单位(请参见Stackoverflow上的此答案):

Calendar.current.dateComponents([.hour], from: fromDate, to: toDate).hour
Calendar.current.dateComponents([.day], from: fromDate, to: toDate).day
Calendar.current.dateComponents([.month], from: fromDate, to: toDate).month
Run Code Online (Sandbox Code Playgroud)

我还没有看到如何使用实际Date对象进行计算。就像是

func computeNewDate(from fromDate: Date, to toDate: Date) -> Date    
     let delta = toDate - fromDate
     let today = Date()
     if delta < 0 {
         return today
     } else {
         return today + delta
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了DateIntervaliOS 10中引入的类型,但是根据文档

[it]不支持反向间隔,即持续时间小于0且结束日期在时间上早于开始日期的间隔。

这样就很难计算日期,尤其是当您不知道哪个是较早的日期时。

是否有任何简洁的方法可以Date直接计算s 之间的时间差(并将它们Date再次添加到实例中)而无需使用它们进行计算timeIntervalSinceReferenceDate

date ios dateinterval swift

10
推荐指数
5
解决办法
7750
查看次数

将文本视图的属性字符串细分为(首选)部分

我正在尝试实现一个非常简单的文本编辑器,该文本编辑器应可同时NSTextView在macOS和UITextViewiOS上使用。该文本编辑器有一个工具栏按钮“分符”,每次单击它都会在当前光标位置插入一个新节。一节应为:

  1. 在视觉上可识别为一个部分(通过在两个后续部分之间添加视觉分隔符,并可能添加一些垂直空白),

  2. 参考。用户应该能够在编辑器中看到所有部分的列表,并且通过单击该列表中的项目,文本视图应立即滚动到该部分的开头。

另一个问题,我问怎么解决的第一个问题,不幸的是,我还没有发现在这部分的答案,但(即使一个解决方案,仅在MacOS作品)。

但是,这个问题集中在第二个方面:
如何在我的文本视图中维护所有部分的列表,其中每个部分都能准确地引用相关文本?

此任务的复杂性在于用户可以随时复制和粘贴或简单地编辑文本的任何部分。因此,我无法保留简单的段落编号数组或类似的内容。

文本视图中几个部分的屏幕截图


我尝试过的事情以及为什么这看起来是如此艰巨的任务:

  1. 我曾经有一个想法是继承NSTextStorage并使用可变属性字符串数组作为其内部存储。然后,我将使用的特殊子类NSTextAttachment并将其用作文本存储中的分节符指示符。问题在于,每当用户编辑文本时,文本视图仅调用以下方法

    func replaceCharacters(in range: NSRange, 
                           with str: String)
    
    Run Code Online (Sandbox Code Playgroud)

    func setAttributes(_ attrs: [NSAttributedString.Key : Any]?, 
                         range: NSRange)
    
    Run Code Online (Sandbox Code Playgroud)

    第一种方法仅传递不带任何属性的纯字符串,第二种方法仅获取属性。这意味着在第一种方法中,我无法确定替换字符是否实际上应该是分节符,因此我无法确定此时在内部文本存储数组中的哪个位置创建新元素。

    在第二种方法中,我不知道用户是否实际添加了新文本(在这种情况下,我将不得不在文本存储数组中为每个分节符属性添加一个新元素)还是用户只是更改了现有的某些属性文本(在这种情况下,先前已经创建了新的数组元素)。

  2. 我还考虑了在表视图或堆栈视图中使用多个文本视图的想法。但是,这不起作用,因为它将使用户无法选择(和删除)多个后续部分中的文本。

  3. 最后,我尝试了子类化NSLayoutManager,但是关于它的文档确实很薄,对我来说似乎是错误的地方。(毕竟,布局经理的职责是文本的布局,而不是跟踪其结构。)

有任何想法吗?

nslayoutmanager nstextview uitextview ios nstextstorage

10
推荐指数
1
解决办法
203
查看次数

我可以将枚举限制为另一个枚举的某些情况吗?

说我有面包店和成分库存:

enum Ingredient {
    case flower     = 1
    case sugar      = 2
    case yeast      = 3
    case eggs       = 4
    case milk       = 5
    case almonds    = 6
    case chocolate  = 7
    case salt       = 8
}
Run Code Online (Sandbox Code Playgroud)

案例rawValue代表库存编号.

然后我有两个食谱:

巧克力蛋糕:

  • 500克花
  • 300克糖
  • 3个鸡蛋
  • 200毫升牛奶
  • 200克巧克力

杏仁蛋糕:

  • 300克花
  • 200克糖
  • 20克酵母
  • 200克杏仁
  • 5个鸡蛋
  • 2克盐

现在我定义一个函数

func bake(with ingredients: [Ingredient]) -> Cake
Run Code Online (Sandbox Code Playgroud)

当然,我相信我的员工,但我仍然想确保他们只使用正确的成分来烘焙蛋糕.

我可以通过定义两个单独的枚举来做到这一点:

enum ChocolateCakeIngredient {
    case flower
    case sugar
    case eggs
    case milk
    case chocolate
}

enum AlmondCakeIngredient { …
Run Code Online (Sandbox Code Playgroud)

enums restriction swift

9
推荐指数
1
解决办法
966
查看次数