C# 在Monotouch中为整个应用程序设置默认UILabel颜色

C# 在Monotouch中为整个应用程序设置默认UILabel颜色,c#,xamarin.ios,monotouch.dialog,C#,Xamarin.ios,Monotouch.dialog,我已经知道如何设置标题栏的色调,并为所有视图设置了背景图像,但就我的一生而言,我无法知道如何为节标题等设置默认的UILabel颜色。我不想把我的代码设置成UIColor.Black,手工操作。有没有办法获得不同UIElement的列表以及为每个元素设置默认值(颜色、字体、大小)的方法?我对标签的颜色特别感兴趣,但任何其他信息对未来都会非常有帮助。从iOS 5开始,有一个类可以处理许多UI元素的全局外观 MonoTouch的工作方式是在这些类型上存在一个名为外观的内部类型。您可以直接从中设置属性(

我已经知道如何设置标题栏的色调,并为所有视图设置了背景图像,但就我的一生而言,我无法知道如何为节标题等设置默认的UILabel颜色。我不想把我的代码设置成UIColor.Black,手工操作。有没有办法获得不同UIElement的列表以及为每个元素设置默认值(颜色、字体、大小)的方法?我对标签的颜色特别感兴趣,但任何其他信息对未来都会非常有帮助。

从iOS 5开始,有一个类可以处理许多UI元素的全局外观

MonoTouch的工作方式是在这些类型上存在一个名为
外观
的内部类型。您可以直接从中设置属性(MonoDevelop的代码完成很容易)。例如


遗憾的是,它并没有涵盖每个控件可能需要的所有内容(在iOS 5之前也不起作用)。

这有点太粗糙了,但这确实起到了作用,它可以与所有其他UI控件一起工作,这些控件都是
UIView
的子类。这假设您有自己的子类
DialogViewController
(我的视图中有很多方便省时的东西,所有视图都将我的DVC子类化以完成工作)

受保护的空视图uicontrol软类型(操作actionToPerform),其中tuitType:UIView
{
ProcessSubviewuicontrol软类型(this.View.Subviews,actionToPerform,0);
}
私有void processSubViewuicontrol软类型(UIView[]视图,操作actionToPerform,int-depth),其中TUIType:UIView
{
如果(视图==null)
返回;
if(actionToPerform==null)
返回;
foreach(视图中的UIView)
{
if(view.GetType()==typeof(TUIType))
{
actionToPerform((TuitType)视图,深度);
}
if(view.Subviews!=null)
{
foreach(视图中的UIView子视图。子视图)
{
ProcessSubViewuicontrol软类型(view.SubView,actionToPerform,深度+1);
}
}
}
}
要解决原始问题并更改节中所有标签的文本颜色,您需要执行以下操作:

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
        ForAllSubviewUIControlsOfType<UILabel>((label, depth) => {
            if ( /*label.Superview is UIView && label.Superview.Superview is UITableView*/ depth == 1 )
            {
                label.TextColor = UIColor.Black;
            }
        });
    }
public override void viewdide出现(bool动画)
{
base.viewdid显示(动画);
FORALLSUBVIEWuicontrol软类型((标签,深度)=>{
如果(/*label.Superview为UIView&&label.Superview.Superview为UITableView*/depth==1)
{
label.TextColor=UIColor.Black;
}
});
}
注释掉的部分是在我决定返回
int depth
计数以查看它是否在视图中之前,确定标签是否存在于一个节中的部分


编辑:似乎这不是完美的解决方案。。。这些元素的深度计数各不相同。在接下来的一两天里,我将不得不想出更好的办法。

您能否将
UILabel
子类化,并在那里设置您的“默认”标签?通过这种方式,您只需在整个代码(或XIB文件)中使用子类。我使用的是Monotouch.Dialog,因此我看不到控制这些元素的方法,除非我要从程序集视图复制源代码并创建自己的类。如果我找不到在一个地方更改标签颜色的方法,我会考虑这条路线。更详细地说,我会有自己的DDRootElement、DDSection等。它会将这些标签设置为我选择的任何颜色。遗憾的是,它只允许您更改背景颜色,而不是前景颜色。不过,我找到了一个解决办法,我将在稍后发布。
    protected void ForAllSubviewUIControlsOfType<TUIType>(Action<TUIType, int> actionToPerform) where TUIType : UIView
    {
        processSubviewUIControlsOfType<TUIType>(this.View.Subviews, actionToPerform, 0);
    }

    private void processSubviewUIControlsOfType<TUIType>(UIView[] views, Action<TUIType, int> actionToPerform, int depth) where TUIType : UIView
    {
        if (views == null)
            return;
        if (actionToPerform == null)
            return;
        foreach (UIView view in views)
        {
            if (view.GetType () == typeof(TUIType))
            {
                actionToPerform((TUIType)view, depth);
            }
            if (view.Subviews != null)
            {
                foreach (UIView subview in view.Subviews)
                {
                    processSubviewUIControlsOfType<TUIType>(view.Subviews, actionToPerform, depth + 1); 
                }
            }
        }
    }
    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
        ForAllSubviewUIControlsOfType<UILabel>((label, depth) => {
            if ( /*label.Superview is UIView && label.Superview.Superview is UITableView*/ depth == 1 )
            {
                label.TextColor = UIColor.Black;
            }
        });
    }